Тип данных XML

Как настроить EF для использования типа данных XML для объекта? Кроме того, как создать SQL-вычисляемые столбцы.

Мы храним много динамических данных, которые некоторые люди вызывают метаданные на строку/запись, но не являются стандартными, поэтому мы полагаемся на структуру данных xml, а затем используем вычисляемые столбцы для создания таких ключей, которые мы можем использовать для более быстрого SQL поиск.

Совершенно откровенно - отображение объекта expando в столбец xml действительно будет плавать на нашей лодке.

Спасибо заранее.

Ответ 1

Первоначальный вопрос:

Как настроить EF для использования типа данных XML для объекта?

В первом коде вы можете сделать это следующим образом:

[Column(TypeName="xml")]
public string Foo {get; set;}

Или через беглый api:

modelBuilder.Entity<MyEntity>()
            .Property(x => x.Foo)
            .HasColumnType("xml");

Вам все равно нужно интерпретировать свойство как строку, и вы сами можете преобразовать его в xml внутри С#. Но таким образом он будет генерироваться как столбец xml, и вы все равно можете выполнять прямые SQL-запросы против него с помощью функций sql xml.

Ответ 2

Все, что вы можете сделать в EF, - это доступ/чтение столбца XML в виде строки - оттуда вы сами по себе. Там нет "встроенного" механизма для превращения этого XML в сериализованный объект или что-то в этом роде.

Как для вычисленных столбцов:

  • вы можете определить простое выражение в SQL

    ALTER TABLE dbo.YourTable
      ADD PriceWithTax AS PriceWithoutTax * (1 + TaxRate)
    

    Это даст вам новый столбец PriceWithTax на основе столбца PriceWithoutTax и другого столбца с именем TaxRate (0.15 для налога 15%)

  • или вы можете создать сохраненную функцию, которая возвращает одно значение, и вызовите это

    ALTER TABLE dbo.YourTable
      ADD PriceWithTax as dbo.AddTaxToPrice(PriceWithoutTax, TaxRate)
    

    Мы также используем этот метод хранимой скалярной функции для анализа в XML, хранящийся в столбце XML, и извлекаем определенные биты и фрагменты в вычисленный столбец.

Если ваш расчет считается "детерминированным" SQL Server, вы также можете добавить ключевое слово PERSISTED в определение столбца. В этом случае ваши значения вычисляются один раз и фактически сохраняются/сохраняются в этой таблице, как и любой другой столбец. Теперь вы можете индексировать эти столбцы! Это отлично работает с, например, скалярные функции, которые захватывают биты из XML и выставляют их в "родительской" таблице.

Ответ 3

В то время как не ответ, который вы ищете, NHibernate полностью поддерживает сценарии, с которыми вы имеете дело. Два подхода:

  • Использование свойства XDocument или XmlDocument в вашей модели домена. Он работает из коробки, и вы можете сопоставить его с типом xml sql, nvarchar(max) и т.д.
  • Использование настраиваемого типа для выполнения любой магии, необходимой для столбца xml (включая mpping для динамического объекта, типа значения, словаря или всего, о чем вы можете мечтать)

Кроме того, для вычисленных свойств в общем случае вы можете взглянуть на formula и readonly.

Если вы достаточно ранены в своем проекте и нуждаетесь в такой гибкости, вы можете рассмотреть возможность переключения.