1

这似乎是 CodeFirst 的一个非常奇怪的行为,

我有一张桌子:

public string Name {get;set;}

[Required]
public virtual Table1 Table1 {get;set;}

[Required]
public virtual Table2 Table2 {get;set;}

[Required]
public virtual Table3 Table3 {get;set;}

现在,如果我从数据库中得到这样的一行:

var row = database.Include("Table1").First();

row.name = "New name";
row.Table1.name = "New name";

database.SaveChanges();

它会抛出2个错误:

Table2 : The Table2 field is required.

Table3 : The Table3 field is required.

问题是,为什么它会验证这 2 个未加载的未使用的引用?

我不希望加载整个实体,因为某些实体可以有很多引用,只更新 1 个字段。

4

1 回答 1

1

如果您使用Required属性标记任何内容,则在保存更改时它必须存在。EF 始终在保存期间验证整个实体,并且导航属性的处理方式与普通属性 => null = 异常相同。验证也不会按设计触发延迟加载。

您的选择是:

  • 不使用Required属性
    • 您可以为每个导航属性添加不可为空的外键属性
    • 您可以使用 fluent-api 代替数据注释
  • 关闭 EF 验证
于 2012-08-08T13:08:29.117 回答