如何在 Entity Framework 中更改 POCO 文件以便保留更改

How to make changes in POCO file in Entity Framework so changes are retained

我在 Entity Framework 中使用数据库优先方法。我有一个 table,其中包含一个名为 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] 吗?

如果您使用的是 ef 核心,请尝试在脚手架命令中添加 --data-annotations 标志。

更多信息请参考:https://docs.microsoft.com/en-us/ef/core/managing-schemas/scaffolding?tabs=dotnet-core-cli#fluent-api-or-data-annotations

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

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

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

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

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

现在我们需要创建包含所有必要属性的元数据 class 并用它装饰我们的 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
    }
}

就是这样。

它冗长吗?是的,但是这个决定是在选择数据库时做出的。

提醒一句:

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

EF 在生成 sql 时无法通过任何方式验证 POCO 类 中的数据。这就是为什么建议我们应该有一个相应的模型对象层(相应的模型 类 为您的实体),您的应用程序可以操作。您可以使用 AutoMapper 之类的东西在模型和实体之间进行映射。通过这种方式,您可以修改模型 类 而不会影响您的 EF 实体。