【问题标题】:EF4 - Force order of executionEF4 - 强制执行顺序
【发布时间】:2011-10-01 10:57:27
【问题描述】:

我有三个表 - 上下文、会话和用户。以下是它们的简化结构。

用户:
用户 ID(整数,PK)
电子邮件 (Varchar(100))

背景:
ContextId (Int, PK)
UserId(来自用户表的 Int、FK)
CurrentSessionId(来自 Session 表的 Int、Nullable、FK)

会话:
SessionId (Int, PK)
UserId(来自用户表的 Int、FK)
ContextId (Int, FK from Context table)

以下是我的代码中删除用户实体的顺序。

1) 将 Context 表的 CurrentSessionId 更新为 null 其中 UserId = UserId 被删除。
2)删除User对应的所有Session
3) 删除User对应的所有Context
4) 最后删除用户。
5) 调用 ObjectContext.SaveChanges()

在调用 ObjectContext.SaveChanges() 时出现以下异常 -

无法确定相关操作的有效顺序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。

我猜 EF4 在确定前 3 个语句的执行顺序时会感到困惑。 是否可以告诉 EF4 先执行什么语句,接下来执行什么?

我可以解决的一种方法是在第一步之后调用 SaveChanges(),然后在第四步之后再次调用它。但我很想知道除此之外是否还有其他优雅的解决方案。

【问题讨论】:

标签: entity-framework entity-framework-4 entity-relationship


【解决方案1】:

基于this MSDN link,EF4 中不能强制执行顺序。我必须在第一步之后调用 SaveChanges() 两次,然后在第四步之后再次调用。

【讨论】:

    【解决方案2】:

    我认为问题在于SessionContext 之间的循环引用;如果您摆脱了Context.CurrentSessionId,那么您生成的Context 对象仍将具有您可以使用的Sessions 属性,但EF 不应该在尝试协商依赖关系时感到不安。您可以像这样手动将CurrentSession 属性添加到Context

    public Session CurrentSession
    {
        get { return this.Sessions.FirstOrDefault(); }
    }
    

    此外,如果您将 EF 模型中的 User -> ContextUser -> Session 关系设置为级联删除(或者更好的是 in the database),那么删除 User 只需两行:

    objectContext.Users.DeleteObject(user);
    objectContext.SaveChanges();
    

    【讨论】:

    • 循环引用是为某种目的而设计的,我对数据库的控制较少,无法对其进行更改。此外,我不想在 EF4 中设置级联删除,因为我已经读过它只会删除 ObjectContext 内存中的实体。对于数据库级联 - 我无法打开它,因为我们的 DBA 讨厌它。
    • 一个坚定不移地讨厌级联删除的 DBA?即使ContextSession 没有User 就毫无意义?哦,亲爱的 :( 你可能会被多次调用 SaveChanges() 所困。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2010-12-23
    • 2017-07-30
    • 1970-01-01
    • 2017-09-06
    • 2013-10-17
    相关资源
    最近更新 更多