首先使用Entity Framework 6.1代码保留和检索序列化实体属性

时间:2015-11-24 23:19:28

标签: entity-framework ef-code-first entity-framework-6 entity-framework-6.1 ef-migrations

示例:假设我有这三个类。 Foo是一个带有DbSet的正确实体框架实体,而我希望我的EF DbContext不知道BarBaz,因为我已经标记了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属性添加到属性中。

目标:

  • 我不一定在寻找一个完整的解决方案(虽然我会接受它),但是需要指导哪些地方可以进入EF的管道,以及如何做到这一点。 I.E.我需要考虑哪些EF类,配置,约定等?
  • 我希望像人们期望的那样生成迁移。也就是说,我不希望我的[SerializeColumn]属性变成指向“Bar”表的“Bar_Id”字段。相反,我想要一个Bar“Bar”字段,它将包含nvarchar(max)对象的序列化版本。如果根本无法做到这一点,请在答案中说明。

注意:

  • 在观看Rowan Miller撰写的Building Applications with Entity Framework 6视频后,想出了这个想法。
  • Bar无法满足我的需求。我需要深度序列化,不需要能够对已序列化的任何属性进行过滤或排序。
  • 我计划使用Newtonsoft的JSON库进行序列化,但序列化的发生方式并不重要。

2 个答案:

答案 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持久性属性,或者在反序列化后需要其他工作)。