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)