asp.net - 如何在实体框架中的 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]
吗?
解决方案
如果您使用的是 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 中使用实体类作为数据模型,一般来说,这被认为是一种不好的做法。推荐的方法是创建单独的模型类并将数据从实体映射到实体。有一些安全原因,您应该在做出最终决定之前进行研究。
推荐阅读
- macos - 在 MAC OS High sierra 中将文本转换为蛇形大小写到驼峰大小写
- javascript - 上传的 .wav 音频文件在 Dropbox 中无法读取/损坏
- javascript - 限制对特定表 ID 的更改
- c# - 如何在 Unity 中设置单元测试并修复缺少的程序集引用错误?
- swift - 如何在 firebase 观察者路径中使用通配符?
- django - 如何在 Django CBV get_queryset() 中检索 GET 参数
- javascript - 如何使用 JS 调用调用 Bitly API 的 PHP 脚本
- javascript - setAttribute('display','block') 不起作用 selenium-webdriver node js
- sql - 创建表时的 SQL 语法错误
- matlab - Matlab strsplit最后一个字符串中的3个点