Сохранение и получение свойства сериализованной сущности с кодом Entity Framework 6.1 в первую очередь

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

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, конфигурации, соглашения и т. д. мне нужно принять во внимание?
  • Я хочу, чтобы миграции генерировались так, как можно было бы ожидать. То есть я бы не хотел, чтобы мое свойство Bar превратилось в поле «Bar_Id», указывающее на таблицу «Bar». Вместо этого я хочу поле nvarchar(max) "Bar", которое будет содержать сериализованную версию объекта Bar. Если это просто невозможно, укажите это в своем ответе.

Примечания:

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

comment
Что-то вроде этого? stackoverflow.com/questions/14779740/   -  person MutantNinjaCodeMonkey    schedule 25.11.2015
comment
@MutantNinjaCodeMonkey Я делал это в прошлом, и это работает, но я хочу сделать постоянство полностью прозрачным. Это только одно свойство Bar с моим выдуманным SerializeColumnAttribute и отсутствие свойства BarSerialized.   -  person Jeremy Cook    schedule 25.11.2015
comment
Почти уверен, что это невозможно в EF6. Что вам действительно нужно, так это преобразователь типов клиентов. Эта функция запланирована для EF7, но еще не реализована.   -  person DavidG    schedule 02.12.2015


Ответы (2)


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

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

person Akash Kava    schedule 05.12.2015
comment
Спасибо, Акаш, но я дал награду @bubi, так как он первым ответил практически тем же ответом, что и вы, хотя и немного менее подробным. Если бы я мог, я бы разделил награду между обоими ответами. - person Jeremy Cook; 09.12.2015
comment
Может быть, было бы лучше переместить логику сериализации в свойство «Панель общедоступных строк». Чтобы не сериализовать и не десериализовать все время, когда что-то меняешь. Или я что-то упускаю? - person zds; 03.08.2016

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

person bubi    schedule 02.12.2015
comment
Я был бы в порядке с ограничениями, которые приходят с текстовым полем поддержки в базе данных (без фильтрации, проекций в базе данных и т. д.). Или под текстовым полем поддержки вы имеете в виду использование двух свойств, одно из которых помечено как [NotMapped], которое представляет собой расшифрованную версию зашифрованного свойства в памяти, которая будет сохраняться в EF? - person Jeremy Cook; 03.12.2015
comment
Для резервного поля я имею в виду два свойства, одно из которых помечено [NotMapped], которое представляет собой расшифрованную версию зашифрованного свойства в памяти, которая будет сохраняться в EF. - person bubi; 03.12.2015
comment
Что ж, в поддержке свойств нет ничего плохого, если дело доходит до этого. Спасибо @bubi, я оставлю эту награду еще немного, чтобы посмотреть, может ли кто-нибудь еще добавить какую-нибудь полезную информацию. - person Jeremy Cook; 03.12.2015