Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我能看看什么';调试时ObjectStateManager中是否有?_C#_Entity Framework - Fatal编程技术网

C# 我能看看什么';调试时ObjectStateManager中是否有?

C# 我能看看什么';调试时ObjectStateManager中是否有?,c#,entity-framework,C#,Entity Framework,背景 我在更新EF中的实体时遇到一些问题。我不断地发现这个错误: “ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象” 我完全意识到,显然有另一个实体附在某处。但是,我目前无法找到它。有很多代码,我已经花了很多时间在上面了。据我所知,我在所有查询中都使用了AsNoTracking()扩展方法 我需要什么 我的问题是:在任何给定的时间,是否有任何方法可以看到ObjectStateManager中的实际内容?如果我能在调试

背景

我在更新EF中的实体时遇到一些问题。我不断地发现这个错误:

“ObjectStateManager中已存在具有相同键的对象。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()
,它只为所讨论的类型提供附加的实体。

感谢您提供的信息。。但是,看看我自己如何解决这个问题的答案。