我有一个由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)。
如何隐藏这一个属性而无需创建一个全新的类来将我的所有数据复制到?
答案 0 :(得分:3)
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书中了解这些自定义。