【问题标题】:Code First update a field with unloaded required navigation propertiesCode First 使用已卸载的必需导航属性更新字段
【发布时间】:2012-08-08 13:00:53
【问题描述】:

这似乎是 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 个字段。

【问题讨论】:

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


    【解决方案1】:

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

    您的选择是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2016-10-25
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      相关资源
      最近更新 更多