栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

编辑
:使用原始答案

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
方法需要知道查找实体的键。您可以创建暴露密钥的简单界面(
IEntity
在我的示例中),并在要处理的所有实体中实现它。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/421442.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号