C# 我能看看什么';调试时ObjectStateManager中是否有?
背景 我在更新EF中的实体时遇到一些问题。我不断地发现这个错误: “ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象” 我完全意识到,显然有另一个实体附在某处。但是,我目前无法找到它。有很多代码,我已经花了很多时间在上面了。据我所知,我在所有查询中都使用了C# 我能看看什么';调试时ObjectStateManager中是否有?,c#,entity-framework,C#,Entity Framework,背景 我在更新EF中的实体时遇到一些问题。我不断地发现这个错误: “ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象” 我完全意识到,显然有另一个实体附在某处。但是,我目前无法找到它。有很多代码,我已经花了很多时间在上面了。据我所知,我在所有查询中都使用了AsNoTracking()扩展方法 我需要什么 我的问题是:在任何给定的时间,是否有任何方法可以看到ObjectStateManager中的实际内容?如果我能在调试
AsNoTracking()
扩展方法
我需要什么
我的问题是:在任何给定的时间,是否有任何方法可以看到ObjectStateManager中的实际内容?如果我能在调试过程中看到其中的项目,我可以更快地跟踪这些项目的来源
如果上述方法不可行,我将非常感谢您就如何最好地解决这一问题提供任何建议。。现在就像大海捞针。本文:包含一些用于转储ObjectStateManager的内容的代码
发件人:
几乎可以肯定的是,这里发生的事情是,你是
试图删除的不是附加的,而是相关的实体或集合
加载到分离实例上的已附加到
ObjectContext。因此,当您尝试附加您尝试附加的实体时
删除时,我们尝试附加整个图形,其中包括实体
已经附加的
这类问题有点麻烦,所以在我的例子中,我尽量使用(Context Context=new myenties())
块在单个中执行尽可能多的活动
另一条建议是在添加对象之前检查对象是否已经存在。有点明显,我知道,但我过去曾被这个问题绊倒过几次。这个问题有助于:
我是这样实施的:
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();
var attachedEntity=context.ChangeTracker.Entries().FirstOrDefault(x=>x.Entity.Id==Entity.Id);
//如果实体已附着。
如果(附件身份!=null)
{
//设置新值
AttacheIdentity.CurrentValues.SetValues(实体);
}
其他的
{
//否则,请附加实体(如果需要)
if(context.Entry(entity.State==EntityState.Detached)
{
实体。附(实体);
}
//将实体的状态设置为“已修改”
context.Entry(entity.State=EntityState.Modified;
}
SaveChanges();
注意:Entities
只是IDbSet
中的context.Set()
,上面的代码来自我的通用存储库中的Update()方法
是否有任何方法可以在任何给定时间查看ObjectStateManager中的实际内容?如果我能在调试过程中看到其中的项目,我可以更快地跟踪这些项目的来源
您还可以使用VisualStudio调试器的快速观察功能查看ObjectStateManager中的内容。路径是:
上下文->对象上下文->对象状态管理器->非公共成员
经常被忽略:Context.Set.Local()
,它只为所讨论的类型提供附加的实体。感谢您提供的信息。。但是,看看我自己如何解决这个问题的答案。