如何将自定义代码与Entity Framework生成的类分离避免被覆盖
解决方案:使用
MetadataType特性关联元数据类实现注解与自动生成代码分离 这是EF Database First场景下的标准解决方案,既不需要修改自动生成的代码,也能正常为原有属性添加数据注解、映射规则等自定义配置,完全避免重新生成edmx时被覆盖的问题。
具体实现步骤
- 新建独立的代码文件(不要修改edmx自动生成的类文件),比如命名为
Person.cs - 保持partial类的命名空间和EF自动生成的
person类完全一致 - 为partial类添加
[MetadataType]特性,关联一个自定义的元数据类,在元数据类中声明和原有类同名的属性,添加你需要的注解即可
完整代码示例
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; // 和EF自动生成的person类保持相同命名空间 public partial class person { // 此处可新增自定义的属性、方法,不会被edmx生成逻辑覆盖 } // 关联元数据类 [MetadataType(typeof(PersonMetadata))] public partial class person { /// <summary> /// 元数据类,仅用于存储原有属性的自定义注解 /// </summary> internal sealed class PersonMetadata { // 属性名需和自动生成类中的属性名完全匹配,无需实现get/set逻辑 [Required(ErrorMessage = "Mother name is required!")] [Column("Mother Name")] public string MotherName { get; set; } // 其他需要加注解的原有属性都可以在这里配置 [Required(ErrorMessage = "Full name is required!")] [MaxLength(100)] public string FullName { get; set; } } }
注意事项
- 两个partial类的命名空间必须完全一致,否则会被识别为两个独立的类导致配置不生效
- 元数据类中的属性名、类型必须和自动生成类中的对应属性完全一致,大小写也要匹配
- EF运行时会自动合并元数据类的特性和原有类的属性,效果和直接将注解写在自动生成的类中完全一致
内容的提问来源于stack exchange,提问作者Abdulsalam Elsharif
相关产品推荐
相关产品推荐

