ASP.NET EF4:添加重复的引用实体

时间:2011-08-07 20:42:22

标签: c# asp.net entity-framework-4

我有一个新的实体框架4实体,它引用另一个实体,一个简单的用户记录。在我的输入数据中,我可能有多个用户记录实例是同一个人。该人可能不存在于数据库中;如果没有,我需要通过创建一个新的用户实体并添加它们来添加它们。

因此,当我创建引用用户的主实体时,我会在数据库中快速查找该用户。如果那个人存在,那很好,我得到了设置的参考。如果没有,我创建一个新的用户记录,并将主实体中的引用设置为新创建的用户实体。当我处理更多记录时,可能会弹出相同的用户,因此当我在“创建新用户”功能中执行查询时,我假设如果存在新创建但尚未保存的实体,则查询将找到该记录,但显然不是(好吧可能是愚蠢的假设)...所以最终的结果是为该用户创建了一个重复的记录,链接到新的主要实体,当它全部保存时,我得到一个“SQL错误2601:不能在对象'dbo.user_table'中插入具有唯一索引'IX_user_table'的重复键行。“错误。

所以我有点困惑如何解决这种情况。问题是我无法在添加新用户实体后立即调用上下文中的SaveChanges(),因为这会导致保存整个实体图,并且引用用户记录的主实体尚未完成,它是还没有准备好保存,所以每次添加新用户时都无法保存整个机会。我需要构建所有实体,然后一次性保存它们。

每次查找用户时都需要进行两次查询,一次是数据库,一次是:

var unsavedVisitors = from c in
  dataContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added)
  where c.Entity is my_table
  select c.Entity;

我真的没有摆弄实体状态管理器的内部,所以我不知道该怎么做 - 我如何查询现有的未保存的用户实体,然后我可以链接到当我循环输入数据时,我正在创建新的主要实体?看起来我可以将c.Entity上面转换为my_table类型和wala,我已经得到了我的参考。我希望只有某种“在我的查询中包含未保存的实体”的技巧或其他东西,以避免使用如此多的查询来处理所有未保存的实体 - 是吗?

1 个答案:

答案 0 :(得分:1)

不,没有“在我的查询中包含未保存的实体”技巧。这是检查ObjectStateManager中条目的正确方法。或者,您可以在某些自定义词典中管理新添加的用户,但这与使用ObjectStateManager基本相同。最后一个选项是首先从重复对象中以某种方式清理您的用户集合。