【问题标题】:How to make changes in POCO file in Entity Framework so changes are retained如何在实体框架中的 POCO 文件中进行更改以保留更改
【发布时间】:2021-08-07 23:31:04
【问题描述】:

我在实体框架中使用数据库优先方法。我有一张表,其中包含一个名为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.net entity-framework poco


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我没有使用 EF Core。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-01-19
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多