Тип данных XML - PullRequest
       15

Тип данных XML

11 голосов
/ 06 апреля 2011

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

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

Откровенно говоря, сопоставление объекта expando со столбцом xml действительно запустит нашу лодку.

Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 04 января 2012

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

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

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

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

Или через свободный API:

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

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

1 голос
/ 09 апреля 2011

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

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

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

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

1 голос
/ 06 апреля 2011

Все, что вы можете сделать в 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 и выставляют его в «родительской» таблице.

...