Как указать тип данных SQL Server XML в модели Entity Frameworks 4.0? - PullRequest
9 голосов
/ 01 марта 2011

Я строю ORM, используя Entity Frameworks 4.0 (CTP5) в шаблоне Model-First. Некоторые из моих сущностей имеют сложные свойства (дерево объектов), которые не обязательно должны быть сущностями ORM - они представляют интерес только для серверных систем, использующих эту базу данных, а не для клиентов, использующих эту базу данных.

Я мог бы просто сериализовать дерево объектов свойства до строки и сохранить его в БД в виде строки, но тип данных SQL Server XML действительно привлекателен. Было бы очень удобно иметь возможность запрашивать содержимое данных XML интеллектуальным способом.

Однако я не вижу способа указать, что мне нужен тип данных XML в Visual Studio Entity Modeler.

Является ли единственный способ добиться этого, чтобы указать строковые поля в модели, создать DDL, а затем изменить DDL, чтобы изменить строковые поля на поля XML? Это кажется ужасно хрупким и писать один раз, никогда не меняйся. Есть ли лучший способ?

Ответы [ 2 ]

9 голосов
/ 01 марта 2011

В «Рецептах Entity Framework 4.0» Ларри Тенни и Зеешан Хирани утверждают, что типы данных XML просто не поддерживаются EF 4.0.

Они предлагают обходной путь, который заключается в том, чтобы сделать свойство строкового типа вкласс сущности, сгенерированный частной моделью и создающий новое свойство (в вашем собственном частичном классе класса сущности) для возврата 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) и нового свойства shadow (CandidateResume) довольно дорого.

Если у кого-то есть идеи получше,Я все еще открыт для предложений.

0 голосов
/ 02 марта 2011

Я нашел способ скрыть тот факт, что Entity Framework отображает XML-свойство в свойство String, используя скрытый сложный тип. Хотя для этого необходимо изменить каждую уязвимую сущность перед ее сохранением в базе данных. Грубо говоря, я использую тот факт, что Entity Framework позволяет вам указывать внутренние типы в вашем файле .csdl.

Я немного подробнее опишу свой подход: .net ORM Сравнение

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...