我可以在EF实体中嵌入一个对象(在保存时序列化,在访问时反序列化)?

kin*_*ngo 20 entity-framework ef-code-first

我有一个类,我想保留元数据 - 有几个交互场景,所以meta允许我为不同的交互类型保留不同的元.

class Feed()
{
    Guid FeedId { get; set; }
    ObjectMetaDictionary Meta { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望EF能够序列化这个ObjectMetaDictionary并将其作为字符串/ VarChar存储在数据库中.当我检索一条记录时,我希望它被反序列化为ObjectMetaDictionary.

EF支持吗?我该怎么做?

我正在使用Entity Framework Code First.

解决:我在下面提供了一个解决我的问题的答案.一旦SO允许我,我会接受这个答案.

kin*_*ngo 23

显然这实际上很容易.由于之前的SO 答案提供了一些帮助,我能够让它工作.

Fluent配置OnModelCreating允许我们告诉EF使用什么作为序列化到DB的值属性并再次退出.

这是我的解决方案:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以在Data属性上放置`[NotMapped]`. (6认同)
  • 这是一件非常光滑的工作,也是我在其他地方没有讨论过的技术,而且我自己也不会轻易解决这个问题.谢谢你的分享! (2认同)