向 EF6 生成的实体类添加属性

Ric*_*ard 4 c# asp.net-mvc entity-framework edmx edmx-designer

我在数据库优先上下文中使用 EF6。在本例中,我在 MVC Web 项目中使用实体类,并希望使用各种验证和显示属性来注释实体的字段。但是,当我通过在 edmx 设计器中从数据库进行更新来刷新实体类时,类会重新生成,并且我的属性会丢失。

解决这个问题的最佳方法是什么?

Ric*_*ard 5

在数据库第一个实体框架项目中使用生成的实体类时,通常需要将属性应用于 class\xe2\x80\x99s 字段。如果您放弃使用 ViewModel 并直接在 MVC Web 项目中使用实体,则尤其如此。

\n\n

当然,如果您直接将验证或显示名称属性应用于字段,则下次由于数据库操作升级而生成数据模型时,这些都将被覆盖。

\n\n

幸运的是,实体框架生成的类被标记为部分类。这意味着我们可以创建第二个类来增强第一个类。实际上,这两个类被视为一个类。例如:

\n\n
[MetadataType(typeof(AnimalMetaData))]\npublic partial class Animal\n{\n    public int ID { get; set; }\n    public string Name { get; set; }\n    public string Description { get; set; }\n    public int NumberOfLegs { get; set; } etc..\n\n\npublic class AnimalMetaData\n{\n    [MaxLength(200)]\n    [Required]\n    public string Name { get; set; }\n\n    [MaxLength(1000)]\n    public string Description { get; set; } etc...\n
Run Code Online (Sandbox Code Playgroud)\n\n

但当然我们这里有一个问题。我们已将属性设置为将元数据类关联到实体类上,这将在数据库更新时被覆盖。那么我们该如何解决这个问题呢?简单的!我们创建第三个名为 Animal 的 \xe2\x80\x98dummy\xe2\x80\x99 类,它位于元数据类旁边,也是部分的:

\n\n
[MetadataType(typeof(AnimalMetaData))]\npublic partial class Animal {}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们用我们的元数据类来注释这个类,所以实际上我们将三个类作为一个类;实体本身,将实体与元数据定义类链接起来的虚拟类。

\n\n

为了保持整洁,您可能会做得比将元数据和虚拟类放在与实体框架生成的实体相邻的单独文件夹中更糟糕。

\n