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

Adding attributes to EF6 generated entity classes

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

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

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

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

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

[MetadataType(typeof(AnimalMetaData))]
public partial class Animal
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int NumberOfLegs { get; set; } etc..


public class AnimalMetaData
{
    [MaxLength(200)]
    [Required]
    public string Name { get; set; }

    [MaxLength(1000)]
    public string Description { get; set; } etc...

但是我们这里当然有问题。我们已将属性与元数据 class 关联到实体 class 上,这将在数据库更新时被覆盖。那么我们如何解决这个问题呢?简单的!我们创建了第三个“虚拟”class,名为 Animal,它位于元数据 class 旁边,也是部分的:

[MetadataType(typeof(AnimalMetaData))]
public partial class Animal {}

我们用我们的元数据 class 注释这个 class,因此实际上我们将三个 class 作为一个;实体本身,虚拟 class 到 link 具有元数据定义的实体 class.

为了保持整洁,您可以做得更糟,而不是将元数据和虚拟 classes 一起放在与 Entity Framework 生成的实体相邻的单独文件夹中。