将属性添加到EF6生成的实体类

时间:2016-03-04 14:54:01

标签: c# asp.net-mvc entity-framework edmx edmx-designer

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

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

1 个答案:

答案 0 :(得分:1)

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

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

幸运的是,Entity Framework生成的类被标记为partial。这意味着我们可以创建第二个类来扩充第一个类。实际上,这两个类被视为一个类。例如:

[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...

但我们当然有问题。我们已将该属性放在实体类的元数据类上,并且这将在数据库的更新中被覆盖。那么我们如何绕过这个呢?简单!我们创建了一个名为Animal的第三个“虚拟”类,它位于元数据类旁边,也是部分的:

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

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

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