如何在 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
标志。
如果您使用的是 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 实体。
我在 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
标志。
如果您使用的是 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 实体。