Пример: предположим, что у меня есть эти три класса. 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, но как сериализация происходит не имеет большого значения.
Что-то вроде этого? http://stackoverflow.com/questions/14779740/can-i-embed-an-object-in-an-ef-entity-serialize-on-save-deserialize-on-access – MutantNinjaCodeMonkey
@MutantNinjaCodeMonkey Я сделал это в прошлое, и это работает, но я хочу сделать настойчивость абсолютно прозрачной. Это только одно свойство 'Bar' с моим составом' SerializeColumnAttribute' и без свойства 'BarSerialized'. –
Довольно точно, что это невозможно в EF6. Вам действительно нужен конвертер типа клиента.Эта функция [запланирована] (https://github.com/aspnet/EntityFramework/issues/242) для EF7, но еще не реализована. – DavidG