我在EF ObjectContext上调用SaveChanges时遇到此异常:
Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints
我认为问题是因为我对我的数据库模型有循环依赖。
即
表用户
表格图片
我正在创建新用户并设置图片
var user = _db.Users.CreateObject();
var picture = _db.Pictures.CreateObject();
picture.User = user;
user.ProfilePicture = picture;
_db.SaveChanges();
但是这引发了异常。
如果我在设置图片的用户之后添加一个额外的调用SaveChanges()它工作得很好,我只想避免再次访问数据库。
有关如何实现这一目标的任何想法?
谢谢!
答案 0 :(得分:2)
无法避免使用数据库设计两次调用SaveChanges
。你不能插入依赖于尚未插入的图片的用户(FK将抛出异常),同时你不能插入依赖于尚未插入的用户的图片(再次FK将抛出异常)。这不是数据库本身特征的EF特征。
由于多次往返,您也无需避免多次SaveChanges
次呼叫。 EF没有命令批处理,因此每次插入,更新或删除都有自己的数据库往返。
如果要调用单个SaveChanges,则必须按如下方式更改数据库:
表用户
表格图片
这是本地一对一关系,其中User是principal,Picture依赖。
答案 1 :(得分:0)
我会说,只需进行一次分配(设置用户或图片),即:
var user = _db.Users.CreateObject();
var picture = _db.Pictures.CreateObject();
user.ProfilePicture = picture;
_db.SaveChanges();
您要在前两行创建新实体,然后按user.ProfilePicture = picture
“链接”它们。 EF应该处理剩下的事情
您无需从双方设置关系。
编辑:这个怎么样?
var user = _db.Users.CreateObject();
var picture = _db.Pictures.CreateObject();
picture.user = user;
user.ProfilePictureId = picture.Id;
_db.SaveChanges();