实体框架:避免循环引用的多次保存

时间:2011-04-23 01:24:25

标签: c# .net entity-framework

我在EF ObjectContext上调用SaveChanges时遇到此异常:

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints

我认为问题是因为我对我的数据库模型有循环依赖。

表用户

  • 编号
  • ProfilePictureId

表格图片

  • 编号
  • 用户ID

我正在创建新用户并设置图片

var user = _db.Users.CreateObject();
var picture = _db.Pictures.CreateObject();

picture.User = user;
user.ProfilePicture = picture;

_db.SaveChanges();

但是这引发了异常。

如果我在设置图片的用户之后添加一个额外的调用SaveChanges()它工作得很好,我只想避免再次访问数据库。

有关如何实现这一目标的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

无法避免使用数据库设计两次调用SaveChanges。你不能插入依赖于尚未插入的图片的用户(FK将抛出异常),同时你不能插入依赖于尚未插入的用户的图片(再次FK将抛出异常)。这不是数据库本身特征的EF特征。

由于多次往返,您也无需避免多次SaveChanges次呼叫。 EF没有命令批处理,因此每次插入,更新或删除都有自己的数据库往返。

如果要调用单个SaveChanges,则必须按如下方式更改数据库:

表用户

  • Id(PK,IDENTITY)

表格图片

  • Id(PK,FK to Users.Id,No IDENTITY)

这是本地一对一关系,其中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();