【问题标题】:Add [IgnoreDataMemeber] to specific properties in a generated partial class将 [IgnoreDataMemeber] 添加到生成的部分类中的特定属性
【发布时间】:2011-07-06 16:44:57
【问题描述】:

我有一个由 T4 模板生成的实体框架 POCO 类。

我打算使用生成的类作为我的数据契约。但是,它有一些不需要包含在合同中的属性。例如,我有一个名为 AddressId 的属性。它是地址表的外键。由于实际地址附加到对象上,因此我不希望 AddressId 对客户端可见。

我可以修改 T4 模板,但我不愿意。

我看到了这个post,它展示了如何使用“MetadataType”向部分类中的现有属性添加属性。这是他们给出的例子:

[MetadataType(typeof(Dinner_Validation))] 
public partial class Dinner {} 

public class Dinner_Validation 
{ 
   [Required] 
   public string Title { get; set; } 
}

但我为我的班级尝试过(使用 [IgnoreDataMember])但它不起作用(仍然显示 AddressId)。

如何隐藏这个属性而不必创建一个全新的类来复制我的所有数据?

【问题讨论】:

  • 你试过[NonSerialized()]吗?
  • @Yann Olaf - 是的,那行不通。 (NonSerialzed() 用于字段,我有需要隐藏的属性。)

标签: c# entity-framework entity-framework-4.1 partial-classes


【解决方案1】:

MetadataType 仅适用于数据注释。它不适用于序列化属性。序列化属性必须直接放在实体中的属性上,因此如果您想使用 T4 模板生成类,则必须将创建这些属性的逻辑直接添加到模板中。

编辑:

如果您想构建生成特殊属性的逻辑,您需要以某种方式告诉 T4 模板哪些属性应该使用该属性进行标记。您可以将此类信息硬编码到 T4 模板中,也可以将该信息放入 EDMX 文件中。 EDMX 文件在其 XML 结构中支持自定义数据元素。这些自定义 XML 元素稍后可以在 T4 模板中用于一些额外的逻辑。唯一的问题是设计器不支持 - 您必须将自定义元素直接添加到以 XML 格式打开的 EDMX 中。

这个整体被称为Structural annotations。可以在my other answer 中找到一些反向处理(修改数据库生成)的示例(另请查看问题中链接的 MSDN 主题)。还有whole extension project,它可能允许添加新的扩展以及设计器支持。我想你也可以在Entity Framework 4 in Action book 中了解这些自定义。

【讨论】:

  • 扩展项目确实很棒。向 EDMX 设计器添加自定义属性非常容易,这些属性会持久保存到 .edmx 文件中。
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多