/ / Як вказати тип даних SQL Server XML у моделі Entity Frameworks 4.0? - .net, xml, сутність-структура, entity-framework-4

Як вказати тип даних SQL Server у моделі Model Entity Frameworks 4.0? - .net, xml, entity-framework, entity-framework-4

Я будую ORM, використовуючи Entity Frameworks 4.0 (CTP5) у шаблоні Model-First. Деякі з моїх об'єктів мають властивості складного (дерева об'єктів), які не повинні бути об'єктами ORM - вони цікавлять лише серверні системи, що використовують цю базу даних, а не клієнти, які використовують цю базу даних.

Я міг би просто серіалізувати дерево об'єктівдо рядка і зберігати його в БД як рядок, але тип даних SQL Server XML дійсно привабливий. Щоб мати можливість запитувати вміст даних XML інтелектуальним способом, було б дуже приємно.

Тим не менш, я не бачу ніякого способу вказати, що я хочу тип даних XML в Visual Studio Entity Modeler.

Це єдиний спосіб зробити це, щоб вказатирядкові рядки в моделі, випускають DDL, потім змінюють DDL, щоб змінити рядкові поля на поля XML? Це здається дуже крихким і одноразовим, змінювати ніколи. Чи є кращий спосіб?

Відповіді:

9 для відповіді № 1

У "Рецептах Entity Framework 4.0" Ларрі Тенні та Зеешан Хірані заявляють, що типи даних XML просто не підтримуються EF 4.0.

Вони пропонують обхідний шлях, який повинен зробитивластивість типу string для класу сутності, що генерується приватною моделлю, і створює нову властивість (у вашому власному частковому класі класу сутності), щоб повернути XElement з внутрішнього властивості рядка:

public partial class Candidate
{
private XElement candidateResume = null;

public XElement CandidateResume
{
get
{
if (candidateResume == null)
{
candidateResume = XElement.Parse(this.Resume);
candidateResume.Changed += (s,e) =>
{
this.Resume = candidateResume.ToString();
}
}

return candidateResume;
}

set
{
candidateResume = value;
candidateResume.Changed += (s,e) =>
{
this.Resume = candidateResume.ToString();
}
this.Resume = value.ToString();
}
}
}

Створення властивості тіні потрібного XMLтипу, як це має працювати, але перетворення між рядком і XML при кожній зміні властивості оригінального рядка (Resume) і нової властивості тіні (CandidateResume) є досить дорогим.

Якщо хтось має якісніші ідеї, я все одно відкриваю для пропозицій.


0 для відповіді № 2

Я знайшов спосіб замаскувати той факт, що EntityРамка відображає XML-властивість у властивість String, використовуючи прихований комплексний тип. Хоча це вимагає від вас змінити кожну з цих об'єктів, перш ніж зберігати їх у базі даних. Приблизно я використовую той факт, що Entity Framework дозволяє вказати внутрішні типи у вашому .csdl файлі.

Тут я детально описую свій підхід: Порівняння ORM

Я також просто встановив CTP5, щоб подивитисяпідхід з кодом, щоб побачити, чи можна використовувати той самий підхід без файлу .edmx або .csdl. Я відредагую цю відповідь, якщо знайду інший спосіб.