Asp.net 如何在实体框架中对POCO文件进行更改,以便保留更改
我在实体框架中使用数据库优先的方法。我有一个表,其中包含一个名为Asp.net 如何在实体框架中对POCO文件进行更改,以便保留更改,asp.net,entity-framework,poco,Asp.net,Entity Framework,Poco,我在实体框架中使用数据库优先的方法。我有一个表,其中包含一个名为CustomerName的字段,它是notnull 生成的POCO如下所示 public partial class Customers { public string CustomerName {get; set;} } 我有两个问题 我怎样才能使这个字段成为必填字段,使我的代码变成这样(如下所示)。正如您所知,POCO是自动生成的,所以在我完成此操作并从数据库更新模型之后,我的所有代码都将被删除 public parti
CustomerName
的字段,它是notnull
生成的POCO如下所示
public partial class Customers
{
public string CustomerName {get; set;}
}
我有两个问题
我怎样才能使这个字段成为必填字段,使我的代码变成这样(如下所示)。正如您所知,POCO是自动生成的,所以在我完成此操作并从数据库更新模型之后,我的所有代码都将被删除
public partial class Customers
{
[Required]
public string CustomerName {get; set;}
}
第二个问题是为什么EF在生成代码时不会自动将
[必需]
应用于此字段?数据库中的字段是非空的
,因此不需要手动写入[必需的]
?如果您使用的是ef core,那么请尝试在scaffold命令中添加--数据注释
标志,就可以自动执行此操作
请参考更多信息:如果您使用的是EF6,以下是答案: 注意,生成的
Customers
类是局部的,我们将利用它。首先,我们需要在完全相同的名称空间中创建一个新的Customers
分部类,其名称完全相同:
namespace WebApp.TheSameNamespaceAsTheGeneratedCustomersClass
{
public partial 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
}
}
就这样
是冗长的吗?是的,但这个决定是在db第一次被选中时做出的
警告一句:
如果您这样做是为了在MVC中使用实体类作为数据模型,一般来说,这被认为是一种不好的做法。建议的方法是创建单独的模型类,并将数据从实体映射到实体。这其中有一些安全原因,在做出最终决定之前,您应该研究这些原因。EF在生成sql时没有任何方法验证POCO类中的数据。这就是为什么建议我们应该有一个相应的模型对象层(实体对应的模型类),您的应用程序可以操作它。您可以使用AutoMapper之类的工具在模型和实体之间进行映射。通过这种方式,您可以在不影响EF实体的情况下修改模型类。我没有使用EF Core。