【问题标题】:Prevent EF 5 from generating a property防止 EF 5 生成属性
【发布时间】:2013-09-07 16:58:39
【问题描述】:

我首先使用带有部分类的 EF5 数据库。我的部分类中有一个属性,其中包含 n 个对象,该对象作为列存储在我的数据库中包含 XML 数据的列。当 EF 尝试使用自定义 getter/setter 读取/写入该对象时,我想处理该对象的序列化/反序列化。

是否可以在我的部分类中公开该列并使用 EF 对其进行映射,而无需为其自动生成属性?

即:

public SomeObject BigComplexObject { get; set; } // forms etc in my app use this
public string BigComplexObjectString // when the EF tries to read/write the column, my custom getter/setter kicks in
{
    get { return this.BigComplexObject.ToXmlString(); }
    set { this.BigComplexObject  = new BigComplexObject(value); }
}

目前,EF 正在为该列自动生成一个成员,所以我只剩下两个。

【问题讨论】:

    标签: c# .net entity-framework serialization entity-framework-5


    【解决方案1】:

    尝试改变逻辑。保留 EF 生成的属性,该属性将使用数据库中的 XML 字符串填充:

    public string BigComplexObjectString { get; set; }
    

    然后执行以下操作:

    [NotMapped]
    public SomeObject BigComplexObject
    {
        get { return new SomeObject(this.BigComplexObjectString); }
        set { this.BigComplexObjectString = value.ToXmlString(); }
    }
    

    不要忘记添加 [NotMapped] 以指示 EF 忽略此属性。

    【讨论】:

    • BigComplexObjectString 将在自动生成的部分类中。您可以将 BigComplexObject 属性放在您自己的部分类中(当然同名)。我已经更改了您的 getter/setter 中的逻辑,以便 EF 可以直接映射并且您的自定义属性不应干扰它。
    【解决方案2】:

    好吧,我们在一个非常相似的情况下使用了一个小技巧......

    我们使用我们的...属性的属性面板(在 edmx 文件中)并在“文档”(摘要或详细描述)行中添加一些内容(可能不是最好的地方,但无论如何)。这可以通过您的 T4 文件访问。

    因此您可以在属性面板中编写类似“useXml”的内容,然后修改您的 tt 以在何时生成所需的代码(例如获取 .tt 文件中的信息)

    if (edmProperty.Documentation != null && edmProperty.Documentation.Summary = "useXml")
      //generate something special
    

    如果在 edmx 中有一个更好的“客户信息”位置会很棒,但我们暂时没有找到更好的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2013-08-15
      • 1970-01-01
      相关资源
      最近更新 更多