首页 > 解决方案 > 如何在实体框架中的 POCO 文件中进行更改以保留更改

问题描述

我在实体框架中使用数据库优先方法。我有一张表,其中包含一个名为的字段CustomerName,它是NOT NULL.

生成的 POCO 如下所示。

public partial class Customers
{
   public string CustomerName {get; set;}
}

我有两个问题。

我怎样才能使它成为必填字段,以便我的代码变成这样(如下所示)。如您所知,POCO 是自动生成的,因此在我执行此操作并从数据库更新模型后,我的所有代码都将被删除。

public partial class Customers
{
   [Required]
   public string CustomerName {get; set;}
}

第二个问题是为什么EF在生成代码时自动不适用于[Required]该字段?该字段NOT NULL在数据库中,所以不应该自动完成而无需手动编写[Required]吗?

标签: asp.netentity-frameworkpoco

解决方案


如果您使用的是 EF6,以下是答案:

请注意,生成的Customers类是部分的,我们将利用它。首先,我们需要Customers在完全相同的命名空间中创建一个具有完全相同名称的新部分类:

namespace WebApp.TheSameNamespaceAsTheGeneratedCustomersClass
{
    public partial class Customers
    {
    }
}

现在这两个部分组成了同一个类,只是这个类的源代码现在被拆分到不同的文件中,其中一个是由工具生成的,一个是您手动编写的。当然,不同之处在于您可以更改后者而无需一直重写。

请注意,名称空间必须匹配,但包含类文件的文件夹不匹配。

现在我们需要创建包含所有必要属性的元数据类并Customers用它装饰我们的部分,如下所示:

namespace WebApp.TheSameNamespaceAsTheGeneratedCustomersClass
{
    [MetadataType(typeof(CustomersMetadata))] //decorating the entity with the metadata
    public partial class Customers
    {
    }

    public class CustomersMetadata //metadata class
    {
       [Required] //your data annotations
       public string CustomerName { get; set; } //the property name has to match
    }
}

就是这样。

它很冗长吗?是的,但是这个决定是在第一次选择 db 时做出的。

提醒一句:

如果您这样做是为了在 MVC 中使用实体类作为数据模型,一般来说,这被认为是一种不好的做法。推荐的方法是创建单独的模型类并将数据从实体映射到实体。有一些安全原因,您应该在做出最终决定之前进行研究。


推荐阅读