【发布时间】:2015-06-27 14:21:07
【问题描述】:
我正在尝试解决 EF 6 上的乐观并发控制问题。我目前想要捕获 DBUpdateConcurrencyException,然后刷新实体。但是我目前收到此异常:
System.InvalidOperationException: 中索引 0 处的元素 要刷新的对象集合具有 null EntityKey 属性值 或未附加到此 ObjectStateManager。
这里是显示目的的代码的简化版本:
using (var dbContextTransaction = dbContext.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
try
{
dbContext.Commit();
}
catch(DbUpdateConcurrencyException ex)
{
((IObjectContextAdapter)KnowledgebaseContext).ObjectContext.Refresh(RefreshMode.StoreWins, en);
dbContextTransaction.Rollback();
}
}
我在 Google 或 SO 上找不到太多关于此异常的信息。任何帮助将不胜感激。
【问题讨论】:
-
您从调试中收集的数据在哪里?模型看起来如何?它是如何映射的?它的关键属性的价值是多少?对象是否附着?
-
如果您尝试向数据库中添加某些内容,则需要在尝试刷新集合之前将其删除。现在,我认为,当您尝试刷新集合时,集合中有一个实体尚未保存在数据库中,也未附加到状态管理器
-
@SaagarEliasJacky 实际上很有帮助。您是否知道我可以使用的资源或文章对此进行进一步解释?
-
“来自两个单独连接的同一实体”可能会导致问题,因为它没有附加在正确的上下文中,是的。虽然如果你说键值为null,那异常有什么不清楚的地方?
标签: c# entity-framework