7

Пример: предположим, что у меня есть эти три класса. Foo является правильной сущностью Entity Framework с DbSet, тогда как я хочу, чтобы мой EF DbContext не знал о Bar и Baz, потому что я пометил свойство Foo's Bar с моим атрибутом SerializedColumn. Применяя этот атрибут, я хочу, чтобы EF сериализовал экземпляр Bar с его Bazes в одно строковое поле и прозрачно десериализовал Bar для объекта Bar, когда Foo материализовался EF.Сохранение и получение сериализованного свойства объекта с помощью Entity Framework 6.1 сначала код

public class Foo 
{ 
    public Guid Id { get; set; } 
    [SerializedColumn] 
    public Bar Bar { get; set; } 
    // .. 
} 

public class Bar 
{ 
    public string Name { get; set; } 
    public Baz[] Baz { get; set; } 
    // .. 
} 

public class Baz 
{ 
    public string Name { get; set; } 
    // .. 
} 

Так столбцы таблицы Foo была бы выглядеть следующим образом:

[Id] [uniqueidentifier] NOT NULL 
[Bar] [nvarchar](max) NULL 

И когда я запросить Foo я вернусь один с Bar собственности уже десериализованное. Когда я вставляю или обновляю Foo, свойство Bar получает сериализованное EF без необходимости думать об этом. Единственное, что мне нужно сделать, это добавить атрибут [SerializeColumn] к свойствам.

Голы:

  • Я не обязательно ищу полномасштабные решения (хотя я бы принял его), но и для руководства о том, где, чтобы перейти в трубопровод EF, и как сделать это. И.Е. какие классы EF, конфигурации, соглашения и т. д. мне нужно принимать во внимание?
  • Я хочу, чтобы Migrations создавались, как и следовало ожидать. То есть я не хочу, чтобы мое свойство Bar превратилось в поле «Bar_Id», которое указывает на таблицу «Бар». Вместо этого я хочу поле «Bar» nvarchar(max), которое будет содержать сериализованную версию объекта Bar. Если это просто невозможно, скажите об этом в своем ответе.

Примечания:

  • Идея этого пришла после просмотра Building Applications with Entity Framework 6 видео, Роуэн Миллер.
  • ComplexType не отвечает моим потребностям. Мне нужна глубокая сериализация и не нужно фильтровать или сортировать любые свойства того, что было сериализовано.
  • Я планирую сериализацию с помощью библиотеки JSON от Newtonsoft, но как сериализация происходит не имеет большого значения.
+0

Что-то вроде этого? http://stackoverflow.com/questions/14779740/can-i-embed-an-object-in-an-ef-entity-serialize-on-save-deserialize-on-access – MutantNinjaCodeMonkey

+0

@MutantNinjaCodeMonkey Я сделал это в прошлое, и это работает, но я хочу сделать настойчивость абсолютно прозрачной. Это только одно свойство 'Bar' с моим составом' SerializeColumnAttribute' и без свойства 'BarSerialized'. –

+2

Довольно точно, что это невозможно в EF6. Вам действительно нужен конвертер типа клиента.Эта функция [запланирована] (https://github.com/aspnet/EntityFramework/issues/242) для EF7, но еще не реализована. – DavidG

ответ

9

Единственное решение это,

public class Foo 
{ 
    public Guid Id { get; set; } 

    // Not Mapped attribute will make EF 
    // ignore this property completely 
    [NotMapped] 
    public Bar BarObject { 
     get; 
     set; 
    } 

    public string Bar{ 
     get{ 
      return JsonConvert.Serialize(BarObject); 
     } 
     set{ 
      BarObject = JsonConvert.Deserialize<BarObject>(value); 
     } 
    } 
} 

Обновлено согласно предложению по @zds

+0

Спасибо, Акаш, но я дал награду @bubi, так как он ответил сначала по существу тем же самым ответом, что и вы, хотя и немного менее подробным. Если бы я мог, я бы разделил щедрость между обоими ответами. –

+1

Невозможно перенести логику сериализации в свойство «public string Bar». Не сериализовать и десериализовать все время, когда что-то менять. Или я чего-то не хватает? – zds

1

Невозможно сделать это без модификации EF. С EF 6 я думаю, что несколько человек сделали это с помощью текстового поля и некоторые ограничения (дети в баре и баре не имеют доступа к сохраненной недвижимости EF или вам нужна другая работа после десериализации).

+0

Я был бы в порядке с ограничениями, которые поставляются с полем текстового резервного копирования в базе данных (без фильтрации, прогнозов в базе данных и т. Д.). Или с помощью поля текстовой поддержки вы ссылаетесь на использование двух свойств, по одному помеченному [NotMapped], который является дешифрованной версией зашифрованной версии, которая сохраняется в EF? –

+0

Для поля подпрограммы я имею в виду два свойства, один из которых отмечен [NotMapped], который является дешифрованной версией зашифрованной версии в памяти, которую сохраняет EF. – bubi

+0

Ну, ничего плохого в свойствах поддержки, если это то, к чему это нужно. Спасибо @bubi. Я собираюсь позволить этой щедрости задержаться немного дольше, чтобы узнать, может ли кто-нибудь добавить полезную информацию. –