我首先将EF 4.1与数据库一起使用。

表格示例:

CREATE TABLE dbo.Foo(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    Created datetime not null default(getdate()),
    Title varchar(80) not null

PRIMARY KEY CLUSTERED ([ID] ASC)
)


EF正确地将所有3列的模型加载为nullable = false。

代码生成项“ ADO.NET DbContext Generator”的输出:

 public partial class Foo
 {
    public int ID { get; set; }
    public System.DateTime Created { get; set; }
    public string Title { get; set; }
 }


在MVC3中,我通过db上下文和foo模型生成FooController。当我调出/ Foo / Create并在空白表单上单击“ Create”时,它在“ Created”字段上显示验证错误,但在“ Title”上却没有。

如果仅输入“创建”日期,则会出现异常:


一个或多个实体的验证失败。参见“ EntityValidationErrors”
属性以获取更多详细信息


唯一的例外是“标题字段”。

我不确定为什么它对一列有效,但对另一列无效。我的第一个解决方法是简单地添加注释,但是该类代码是由EF自动生成的。

唯一可行的解​​决方法是使用部分元数据类:ASP.NET MVC3 - Data Annotations with EF Database First (ObjectConext, DbContext)

我可以根据需要添加[Required]标签,但这不是必需的。这是EF中的错误还是我只是缺少一些东西?

最佳答案

这不是错误,EF根本不会添加这些属性。据我所知,数据库优先方法(由设计人员生成的实体类)甚至没有执行验证。您引用的链接是针对您问题的有效解决方案。引入了包含实际元数据的伙伴类的原理,原因是您不能向部分类中的现有属性添加属性。

代码优先方法具有内置功能来验证注释,请参见:Entity Framework 4.1 Validation。使用数据库优先的另一种解决方案是创建一个应用这些属性T4 Templates and the Entity Framework的自定义代码生成器。

10-05 20:53
查看更多