3

我有三个表格 - 上下文,会话和用户。以下是它们的简化结构。EF4 - 强制执行顺序

用户:
用户ID(中间体,PK)
电子邮件(VARCHAR(100))

上下文:
CONTEXTID(中间体,PK)
用户ID(中间体,FK从用户表)
CurrentSessionId(Int,Nullable,来自会话表的FK)

Session:
的sessionID(中间体,PK)
用户ID(中间体,FK从用户表)
CONTEXTID(中间体,FK从上下文表)

下面是在我的代码删除用户实体的序列。

1)将Context table的CurrentSessionId更新为null,其中UserId = UserId将被删除。
2)删除用户对应的所有会话
3)删除用户对应的所有上下文
4)最后删除用户。
5)呼叫ObjectContext.SaveChanges()

当打电话ObjectContext.SaveChanges()我得到下面的异常 -

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

我想EF4会因为确定前3个语句的执行顺序而感到困惑。 是否可以告诉EF4先执行哪些语句,然后执行什么?

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

+0

Dupe of http://stackoverflow.com/questions/4517566/does-entity-framework-support-circular-references/11812560#11812560 –

回答

4

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

0

我认为问题在于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(); 
+0

循环引用是为某个目的而设计的,我对数据库的控制较少,它改变了。另外我不想在EF4中设置级联删除,因为我已经读过,它只会删除ObjectContext内存中的实体。而对于数据库级联 - 我们无法打开,因为我们的DBA讨厌它。 – muruge

+1

数据库管理员谁坚持不懈地讨厌级联删除?即使'Context'和'Session'在没有'User'的情况下毫无意义?哦,亲爱的:(你可能会被多次调用SaveChanges()'。 –