5

背景

我在更新 EF 中的实体时遇到了一些麻烦。我不断收到此错误:

“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象”

我完全清楚在某处显然存在另一个实体。但是,我目前无法追踪它。有很多代码,我已经花了很多时间。据我所知,我AsNoTracking()在所有查询中都使用了扩展方法。

我需要的

我的问题是:有什么方法可以在任何给定时间查看ObjectStateManager中的实际内容吗?如果我可以在调试期间看到其中的项目,我可以更快地追踪到这些项目的来源。

如果上述情况不可行,我将不胜感激有关如何最好地解决此问题的任何建议。现在就像大海捞针一样。

4

4 回答 4

4

有什么方法可以在任何给定时间查看 ObjectStateManager 中的实际内容吗?如果我可以在调试期间看到其中的项目,我可以更快地追踪到这些项目的来源。

您还可以使用 Visual Studio 调试器的快速监视功能查看 ObjectStateManager 中的内容。路径是:

上下文 -> ObjectContext -> ObjectStateManager -> 非公共成员

于 2013-02-10T22:12:25.917 回答
1

这个问题有帮助:

找出实体是否附加到 dbContext 的最合理方法是什么?

我以这种方式实现了它:

var attachedEntity = context.ChangeTracker.Entries<T>().FirstOrDefault(x => x.Entity.Id == entity.Id);

                // If the entity is already attached. 
                if (attachedEntity != null)
                {
                    // Set new values
                    attachedEntity.CurrentValues.SetValues(entity);
                }
                else
                {
                    // Else attach the entity (if needed)
                    if (context.Entry(entity).State == EntityState.Detached)
                    {
                        Entities.Attach(entity);
                    }
                    // Set the entity's state to modified
                    context.Entry(entity).State = EntityState.Modified;
                }
                context.SaveChanges();

注意:Entities只是IDbSet<T>来自context.Set<T>(),上面的代码来自我的通用存储库中的 Update() 方法。

于 2012-10-13T07:41:05.270 回答
1

经常被忽视:Context.Set<T>.Local() 它只为相关类型提供附加实体。

于 2013-02-11T00:38:30.813 回答
0

这篇文章: http: //mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/08/27/9656.aspx包含一些用于转储ObjectStateManager.

这里

几乎可以肯定这里发生的情况是您尝试删除的对象未附加,但加载在分离实例上的相关实体或集合已附加到 ObjectContext。因此,当您尝试附加要删除的实体时,我们会尝试附加整个图表,其中包括已附加的实体。

这种问题有点痛苦,所以就我而言,我尝试在一个using(Context context = new MyEntities())街区内尽可能多地进行活动。

另一条建议是在添加对象之前检查对象是否不存在。有点明显,我知道,但过去我被那个绊倒了几次。

于 2012-10-13T04:19:40.570 回答