C# 为什么我不能用dbContext更新记录?

C# 为什么我不能用dbContext更新记录?,c#,ef-code-first,C#,Ef Code First,我已经尽了我应有的努力,阅读了这里的许多问题,但我无法解决我的问题。我有一个非常简单的模式。我使用get方法查找记录(使用适当的where子句提供感兴趣的记录): public IQueryable Get()其中TDataModel:class,IDataModel { 返回_context.Set(); } 然后修改我感兴趣的对象的任何属性,然后将修改后的对象传递给更新方法: public TDataModel Update<TDataModel>(TDataModel ite

我已经尽了我应有的努力,阅读了这里的许多问题,但我无法解决我的问题。我有一个非常简单的模式。我使用get方法查找记录(使用适当的where子句提供感兴趣的记录):

public IQueryable Get()其中TDataModel:class,IDataModel
{
返回_context.Set();
}
然后修改我感兴趣的对象的任何属性,然后将修改后的对象传递给更新方法:

public TDataModel Update<TDataModel>(TDataModel item) where TDataModel : class, IDataModel
{
    _context.Set<TDataModel>().Attach(item);
    _context.Entry<TDataModel>(item).State = EntityState.Modified;
    _context.SaveChanges();
    return item;
}
公共TDataModel更新(TDataModel项),其中TDataModel:class,IDataModel
{
_context.Set().Attach(项);
_context.Entry(item).State=EntityState.Modified;
_SaveChanges();
退货项目;
}
我一直很幸运,有以下几点:

ObjectStateManager中已存在具有相同密钥的对象。 ObjectStateManager无法跟踪具有相同属性的多个对象 钥匙


我已经尝试了在这里提出的许多问题中提出的许多解决方案,但都没有效果。

因为实体框架使用更改跟踪(默认情况下……但您可以使用不同的合并选项将其关闭),所以不能使用相同的键(在相同的上下文中)附加两个实体


因此,您必须首先分离旧对象,或者不附加新对象(因为更改跟踪器已经在为您执行此操作)。

何时发生错误?在
.Attach(item)
.SaveChanges
上?我知道您可能已经经历了这一过程,但您是否处于查询和
.Attach(item)
之间的相同数据上下文中?当我是一个笨蛋时,当互联网指出这一点时,我很感激。不,我不是。问题解决了。如果你回答,我将投票并接受
public TDataModel Update<TDataModel>(TDataModel item) where TDataModel : class, IDataModel
{
    _context.Set<TDataModel>().Attach(item);
    _context.Entry<TDataModel>(item).State = EntityState.Modified;
    _context.SaveChanges();
    return item;
}