为什么实体框架没有根据需要注释一些不可为空的列?

时间:2011-07-08 03:07:42

标签: entity-framework asp.net-mvc-3 ef-database-first

我首先使用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并在空白表单上点击“创建”时,它会在“已创建”字段上显示验证错误,但不会在“标题”上显示。

如果我只输入“创建”日期,我会得到一个例外:

  

一个或多个实体的验证失败。请参阅'EntityValidationErrors'   物业详情

例外情况是“标题字段是必需的”。

我不确定为什么它适用于一列而不是另一列。我的第一个修复是简单地添加注释,但是类代码是由EF自动生成的。

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

我可以根据需要添加[Required]标签,但这应该是不必要的。这是EF中的一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

这不是错误,EF根本不添加这些属性。据我所知,数据库优先方法(设计者生成的实体类)甚至不执行验证。您引用的链接是解决您问题的有效方法。由于您无法将属性添加到分部类中的现有属性,因此引入了包含实际元数据的伙伴类原则。

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