Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何在实体框架中对POCO文件进行更改,以便保留更改_Asp.net_Entity Framework_Poco - Fatal编程技术网

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。