代码优先更新具有卸载所需导航属性的字段

时间:2012-08-08 13:00:54

标签: c# linq entity-framework ef-code-first code-first

这似乎是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.

问题是,为什么要验证那两个未加载的未使用的引用?

我不想加载ENTIRE实体,因为一些实体可以有很多引用,只需要更新1个字段。

1 个答案:

答案 0 :(得分:1)

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

您的选择是:

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