示例:假设我有这三个类。 Foo
是一个带有DbSet的正确实体框架实体,而我希望我的EF DbContext不知道Bar
和Baz
,因为我已经标记了Foo的Bar属性{{1} }属性。通过应用该属性,我希望EF将带有Bazes的Bar实例序列化为单个字符串字段,并在EF实现Foo时透明地将Bar反序列化为Bar对象。
SerializedColumn
所以Foo的表格列如下:
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; }
// ..
}
当我查询[Id] [uniqueidentifier] NOT NULL
[Bar] [nvarchar](max) NULL
时,我会回复一个已经反序列化的Foo
属性。当我插入或更新Bar
时,Foo
属性会被EF序列化,而我无需考虑它。我唯一要做的就是将Bar
属性添加到属性中。
目标:
[SerializeColumn]
属性变成指向“Bar”表的“Bar_Id”字段。相反,我想要一个Bar
“Bar”字段,它将包含nvarchar(max)
对象的序列化版本。如果根本无法做到这一点,请在答案中说明。注意:
Bar
无法满足我的需求。我需要深度序列化,不需要能够对已序列化的任何属性进行过滤或排序。答案 0 :(得分:10)
唯一的解决方案就是这个,
public class Foo
{
public Guid Id { get; set; }
// Not Mapped attribute will make EF
// ignore this property completely
[NotMapped]
public Bar BarObject {
get;
set;
}
public string Bar{
get{
return JsonConvert.Serialize(BarObject);
}
set{
BarObject = JsonConvert.Deserialize<BarObject>(value);
}
}
}
根据@zds
的建议更新答案 1 :(得分:1)
没有修改EF就无法做到这一点。 使用EF 6,我认为有几个人使用文本支持字段和一些限制(Bar和Bar子级无法访问EF持久性属性,或者在反序列化后需要其他工作)。