gpt4 book ai didi

c# - 无法附加分离的实体(具有相同键的实体已经在上下文中)

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:46 24 4
gpt4 key购买 nike

我正在使用 Entity Framework 6,Code First 方法。我将尝试用一段简单的代码来展示我的问题:

public void ViewEntity(MyEntity Entity) // Want to read properties of my entity
{
using (var Db = new MyDbContext())
{
var DummyList = Db.MyEntities.ToList(); // Iteration on this DbSet
Db.MyEntities.Attach(Entity); // Exception
}
}

异常消息是:附加类型为“MyProgram.MyEntity”的实体失败,因为相同类型的另一个实体已经具有相同的主键值。

从我在 MSDN 上读到的内容来看,这是一种预期的行为。但是我在最后一行想要的是首先检查是否有一个具有相同 key 的实体已经附加到上下文;如果是,请改用它,并且仅以其他方式将我的实体附加到上下文。

但是我没能找到这样做的方法。 ObjectContext 实例上有许多实用方法(例如 GetObjectByKey)。我无法对它们全部进行测试,因为它们最终都需要一个合格的 EntitySetName,而我在实际实现中没有任何东西,因为这个方法应该在一个抽象类上,并且它应该适用于所有实体类型。调用 Db.Entity(this) 是没有用的,不存在具有 EntitySetName 的 EntityKey。

所以所有这些都变得非常复杂。用我的话来说,我只想检查对象是否已经在“缓存”(上下文)中,使用它,否则使用我的对象并将其附加到此上下文。

明确地说,我首先有一个从 TreeNode.Tag 分离的对象,我只想再次使用它,或者如果它不可能;如果上下文中已经有一个),请改用那个。也许我遗漏了 EF6 的一些关键概念,我才刚刚开始使用 EF。

最佳答案

我找到了适合我的解决方案。正如我猜对的那样,ObjectContext.GetObjectByKey 方法可以满足我的需要,但首先我需要构造 qualifiedEntitySetName,然后我找到了一种方法来实现。有点麻烦(使用反射,迭代 MyDbContext 的属性),但与我从所有这些中提出的问题相比并不令人头疼。为了以防万一,下面是适合我的解决方案的代码补丁:

public SdsAbstractObject GetAttachedToContext()
{
var ObjContext = (SdsDbContext.Current as IObjectContextAdapter).ObjectContext;
var ExistingItem = ObjContext.GetObjectByKey(GetEntityKey()) as SdsAbstractObject;
if (ExistingItem != null)
return ExistingItem;
else
{
DbSet.Attach(this);
return this;
}
}

public EntityKey GetEntityKey()
{
string DbSetName = "";
foreach (var Prop in typeof(SdsDbContext).GetProperties())
{
if (Prop.PropertyType.IsGenericType
&& Prop.PropertyType.GenericTypeArguments[0] == ObjectContext.GetObjectType(GetType()))
DbSetName = Prop.Name;
}
if (String.IsNullOrWhiteSpace(DbSetName))
return null;
else
return new EntityKey("SdsDbContext." + DbSetName, "Id", Id);
}

关于c# - 无法附加分离的实体(具有相同键的实体已经在上下文中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744534/

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