Могу ли я встроить объект в объект EF (сериализуем при сохранении, десериализации доступа)?
У меня есть класс, для которого я хочу сохранить метаданные, - существует несколько сценариев взаимодействия, поэтому meta позволяет мне сохранять разные мета для разных типов взаимодействия.
class Feed()
{
Guid FeedId { get; set; }
ObjectMetaDictionary Meta { get; set; }
}
Я бы хотел, чтобы EF сериализовал этот ObjectMetaDictionary и сохранил его как строку /VarChar в базе данных. Когда я беру запись, я хочу, чтобы она была десериализована как ObjectMetaDictionary.
Поддерживает ли EF это? Как я могу это сделать?
Я использую сначала код Entity Framework.
РЕШЕННО: я дал ответ ниже, который решил мою проблему. Я буду принимать этот ответ, как только SO позволит мне.
Ответы
Ответ 1
По-видимому, это на самом деле довольно легко. Я смог заставить его работать благодаря некоторой помощи из предыдущего SO .
Свободная конфигурация в OnModelCreating
позволяет нам рассказать EF, что использовать в качестве свойства value для сериализации в БД и снова вернуться.
Здесь мое решение:
public class Feed
{
public virtual Guid FeedId { get; set; }
public virtual FeedMetaData Meta { get; set; }
public virtual string Title { get; set; }
public virtual string Description { get; set; }
}
public class FeedMetaData
{
public Dictionary<string, string> Data { get; set; }
public string Serialized
{
get { return JsonConvert.SerializeObject(Data); }
set
{
if(string.IsNullOrEmpty(value)) return;
var metaData = JsonConvert.DeserializeObject<Dictionary<string, string>>(value);
Data = metaData ?? new Dictionary<string, string>();
}
}
// addl code removed...
}
public class FeedsDbContext : DbContext
{
public DbSet<Feed> Feeds { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.ComplexType<FeedMetaData>()
.Property(p => p.Serialized)
.HasColumnName("Meta");
modelBuilder.ComplexType<FeedMetaData>().Ignore(p => p.Data);
base.OnModelCreating(modelBuilder);
}
}
Ответ 2
У вас должен быть простой объект Entity Framework и иметь свойство String для столбца в базе данных.
class Feed()
{
Guid FeedId { get; set; }
String Meta { get; set; }
}
Создайте методы, которые сохраняют и загружают свойство как таковое: (прошло некоторое время с тех пор, как я использовал EF, поэтому я не уверен, что вы можете создать свойство переходного процесса с помощью этих getter/seters или если вам нужно что-то еще )
//Reading from string column Meta
(ObjectMetaDictionary) XamlServices.Load(new StringReader(someFeed.Meta));
//Saving to string column Meta
someFeed.Meta = XamlServices.Save(value);
Это еще одна проблема для вашего проекта. Изменение ObjectMetaDictionary
может привести к тому, что он не будет десериализоваться из базы данных правильно. Ваш ObjectMetaDictionary
становится по существу частью вашей схемы базы данных, и вам нужно будет обрабатывать версии или изменения соответственно.