【问题标题】:Have the foreign key and navigation property synced immediately立即同步外键和导航属性
【发布时间】:2016-08-23 07:35:02
【问题描述】:

我必须做些什么才能让 Entity Framework 在外键和导航属性发生更改时立即同步,而不仅仅是在调用 SaveChanges 之后?

public class Model
{
    [Key]
    public int ModelId { get; set; }

    public string Name { get; set; }

    public virtual Model Other { get; set; }

    [ForeignKey("Other")]
    public int OtherId { get; set; }

    // Other regular mapped properties not shown
}

我使用的是 EF 6.1.3 Code First。更改跟踪未明确停用,应使用。

我需要这个,因为我的 UI 网格控件只更改了 ID(在此处更改导航对象会导致麻烦),但我的业务逻辑需要在 ID 更改后立即来自引用对象的信息,然后再保存记录。被引用对象的数据决定了用户编辑记录的其他选项。

【问题讨论】:

  • 为什么需要这样的方式?您的业​​务用例是什么?
  • ((IObjectContextAdapter)context).ObjectContext.DetectChanges() 你在找什么吗?
  • 我的 UI 网格只更改了 ID(在此处更改导航对象会导致麻烦),但我的业务逻辑需要在 ID 更改后立即来自引用对象的信息,然后再保存记录。
  • @AdilMammadov 我不确定那是什么。我不想显式实现所有自动属性,这会使代码爆炸。我读过 EF 应该能够做我正在寻找的事情,但没有人描述如何到达那里。
  • @ygoe,我没有说任何关于明确实现所有自动属性 :)。 DetectChanges 方法应该修复身份,但你不能直接在 DbContext 上调用它,所以你从 DbContext((IObjectContextAdapter)context).ObjectContext 得到 ObjectContext。然后调用ObjectContextDetectChanges方法。

标签: .net entity-framework foreign-keys


【解决方案1】:

看来this question 回答了我的问题:

所有映射的属性都必须是虚拟的。一旦单个映射属性不是虚拟的,整个事情就不再起作用,也没有人告诉你。

我还没有看到一个简单的方法来验证这是否已完成,但如果完成了,Entity Framework 将应用一些“更有效的更改跟踪”,这也具有外键属性更新导航属性的效果,反之亦然反之亦然。

哦,这仅适用于实体框架代理类。在查询现有对象或使用 DbSet.Create() 方法时,您会得到这些。直接创建模型类的新实例不会自动执行任何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2011-08-09
    相关资源
    最近更新 更多