Подтвердить что ты не робот

Могу ли я встроить объект в объект EF (сериализуем при сохранении, десериализации доступа)?

У меня есть класс, для которого я хочу сохранить метаданные, - существует несколько сценариев взаимодействия, поэтому meta позволяет мне сохранять разные мета для разных типов взаимодействия.

class Feed()
{
    Guid FeedId { get; set; }
    ObjectMetaDictionary Meta { get; set; }
}

Я бы хотел, чтобы EF сериализовал этот ObjectMetaDictionary и сохранил его как строку /VarChar в базе данных. Когда я беру запись, я хочу, чтобы она была десериализована как ObjectMetaDictionary.

Поддерживает ли EF это? Как я могу это сделать?

Я использую сначала код Entity Framework.

РЕШЕННО: я дал ответ ниже, который решил мою проблему. Я буду принимать этот ответ, как только SO позволит мне.

4b9b3361

Ответ 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 становится по существу частью вашей схемы базы данных, и вам нужно будет обрабатывать версии или изменения соответственно.