Тип данных 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
.
Если вы достаточно ранены в своем проекте и нуждаетесь в такой гибкости, вы можете рассмотреть возможность переключения.