防止EF 5生成属性

时间:2013-09-07 16:58:39

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

我首先使用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正在为该列自动生成一个成员,所以我剩下两个。

2 个答案:

答案 0 :(得分:0)

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

public string BigComplexObjectString { get; set; }

然后执行以下操作:

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

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

答案 1 :(得分:0)

好吧,我们在一个非常相似的案例中使用了一个小技巧......

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

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

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

在edmx中为“cusom infos”提供一个更好的地方会很棒,但我们没有找到更好的东西。