gpt4 book ai didi

c# - ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法使用相同的键跟踪多个对象

转载 作者:IT王子 更新时间:2023-10-29 03:41:34 27 4
gpt4 key购买 nike

使用带有通用存储库模式的 EF5 和 ninject 进行依赖注入(inject),并在尝试使用我的 edmx 使用存储过程将实体更新到数据库时遇到问题。

我在 DbContextRepository.cs 中的更新是:

public override void Update(T entity)
{
if (entity == null)
throw new ArgumentException("Cannot add a null entity.");

var entry = _context.Entry<T>(entity);

if (entry.State == EntityState.Detached)
{
_context.Set<T>().Attach(entity);
entry.State = EntityState.Modified;
}
}

从我的 AddressService.cs 返回到我的存储库,我有:

 public int Save(vw_address address)
{
if (address.address_pk == 0)
{
_repo.Insert(address);
}
else
{
_repo.Update(address);
}

_repo.SaveChanges();

return address.address_pk;
}

当它遇到 Attach 和 EntityState.Modified 时,它会吐出错误:

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

我查看了堆栈和 Internet 上的许多建议,但没有提出任何解决方法。任何解决方法将不胜感激。

谢谢!

最佳答案

编辑:原始答案使用Find 而不是Local.SingleOrDefault。它与@Juan 的 Save 方法结合使用,但它可能会导致对数据库进行不必要的查询,并且 else 部分可能从未执行过(执行 else 部分会导致异常,因为 Find 已经查询数据库并没有找到该实体,因此无法更新)。感谢@BenSwayne 发现问题。

您必须检查具有相同键的实体是否已被上下文跟踪并修改该实体而不是附加当前实体:

public override void Update(T entity) where T : IEntity {
if (entity == null) {
throw new ArgumentException("Cannot add a null entity.");
}

var entry = _context.Entry<T>(entity);

if (entry.State == EntityState.Detached) {
var set = _context.Set<T>();
T attachedEntity = set.Local.SingleOrDefault(e => e.Id == entity.Id); // You need to have access to key

if (attachedEntity != null) {
var attachedEntry = _context.Entry(attachedEntity);
attachedEntry.CurrentValues.SetValues(entity);
} else {
entry.State = EntityState.Modified; // This should attach entity
}
}
}

如您所见,主要问题是 SingleOrDefault 方法需要知道 key 才能找到实体。您可以创建简单的接口(interface)来公开 key (在我的示例中为 IEntity),并在您想要以这种方式处理的所有实体中实现它。

关于c# - ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法使用相同的键跟踪多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12585664/

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