示例:假设我有这三个类. Foo是一个带有DbSet的正确实体框架实体,而我希望我的EF DbContext不知道Bar和Baz,因为我已经使用我编写的SerializedColumn属性标记了Foo的Bar属性.通过应用该属性,我希
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; } // .. }
所以Foo的表格列如下:
[Id] [uniqueidentifier] NOT NULL [Bar] [nvarchar](max) NULL
当我查询Foo时,我得到一个已经反序列化的Bar属性.当我插入或更新Foo时,Bar属性会被EF序列化,而我无需考虑它.我唯一要做的就是将[SerializeColumn]属性添加到属性中.
目标:
>我不一定在寻找一个完整的解决方案(虽然我会接受它),但是有关如何进入EF管道的指导,以及如何做到这一点. I.E.我需要考虑哪些EF类,配置,约定等?
>我希望像人们期望的那样生成迁移.也就是说,我不希望我的Bar属性变成指向“Bar”表的“Bar_Id”字段.相反,我想要一个nvarchar(max)“Bar”字段,它将包含Bar对象的序列化版本.如果这根本不可能,请在答案中说明.
笔记:
>在观看Rowan Miller的Building Applications with Entity Framework 6视频后,我们想到了这个想法.
> ComplexType不能满足我的需求.我需要深度序列化,并且不需要能够对已序列化的任何属性进行过滤或排序.
>我计划使用Newtonsoft的JSON库进行序列化,但序列化的发生方式并不重要.
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的建议更新