gpt4 book ai didi

entity-framework-4 - ObjectStateManager.TryGetObjectStateEntry 为附加对象返回 false

转载 作者:行者123 更新时间:2023-12-04 07:53:53 25 4
gpt4 key购买 nike

TryGetObjectStateEntry 返回 false,但是当我尝试附加实体时,我得到“ObjectStateManager 中已存在具有相同键的对象”。 ObjectStateManager 无法跟踪具有相同键的多个对象。

实体键的类型为 Guid。

这怎么可能?

编辑:我正在附加 2 个具有不同 key 的实体。错误总是发生在我附加的这种类型的第二个实体上。如果我交换它们,错误仍然在第二个。

    public bool IsAttached<T>(T obj) where T : class
{
ObjectStateEntry entry = null;

ObjectContext objCtx = GetObjectContext();

bool isKeyAttached = false;

EntityContainer container = objCtx.MetadataWorkspace.GetEntityContainer(objCtx.DefaultContainerName, DataSpace.CSpace);
EntitySetBase entitySet = container.BaseEntitySets.Where(item => item.ElementType.Name.Equals(typeof(T).Name)).FirstOrDefault();
System.Data.EntityKey key = objCtx.CreateEntityKey(entitySet.Name, obj);

if (objCtx.ObjectStateManager.TryGetObjectStateEntry(key, out entry))
{
isKeyAttached = entry.State != System.Data.EntityState.Detached;
}

return isKeyAttached;
}

最佳答案

如果您附加的实体具有引用其他实体的导航属性,则会出现此问题。例子:

public class Parent
{
public int Id { get; set; }
public Child Child { get; set; }
}

public class Child
{
public int Id { get; set; }
}

以下代码将抛出异常:
using (var context = new MyDbContext())
{
var parent = new Parent { Id = 1 };
var child1 = new Child { Id = 1 };
parent.Child = child1;

var child2 = new Child { Id = 1 }; // same key

context.Children.Attach(child2); // child with key = 1 is attached now

var objContext = ((IObjectContextAdapter)context).ObjectContext;

ObjectStateEntry entry;
bool isAttached = objContext.ObjectStateManager.TryGetObjectStateEntry(
new EntityKey("MyDbContext.Parents", "Id", parent.Id), out entry);
// isAttached will be false because a Parent with Id = 1 is not attached
if (!isAttached)
{
// we assume now that we could attach the parent safely
context.Parents.Attach(parent);

// Assumption is wrong -> Exception, because Attach attaches the whole
// object graph, so it tries also to attach child1 together with parent
// But child1 has the same key as child2 which is already attached
}
}

所以,重点是 TryGetObjectStateEntry只检查基础实体的状态,不考虑任何导航属性。 Attach另一方面,不仅附加了基本实体,还附加了尚未附加的子实体,从而导致异常。

关于entity-framework-4 - ObjectStateManager.TryGetObjectStateEntry 为附加对象返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com