目前,我在我的通用存储库中实现了此更新功能
public virtual void Update(TEntity entity)
{
var dbContext = _context as DbContext;
var entry = dbContext.Entry(entity);
var key = GetPrimaryKey(entry);
if (entry.State == EntityState.Detached)
{
var currentEntry = _dbSet.Find(key);
if (currentEntry != null)
{
dbContext.Entry(currentEntry).CurrentValues.SetValues(entity);
dbContext.Entry(currentEntry).State = EntityState.Modified;
}
else
{
_dbSet.Attach(entity);
entry.State = EntityState.Modified;
}
}
dbContext.SaveChanges();
}
我尝试调试,发现“currentEntry”的值更新为与“entity”相同。但是数据库中的数据没有更新。如果您有任何解决方案,请提供帮助。
答案 0 :(得分:1)
我的通用存储库上有一个更简单的Update方法工作版本,看看是否有帮助:
public int Update<T>(T item) where T : class
{
Guard.ArgumentNotNull(item, "item");
Set<T>().Attach(item);
// Calling State on an entity in the Detached state will call DetectChanges()
// which is required to force an update.
Entry(item).State = EntityState.Modified;
return SaveChanges();
}
由于EF在内部跟踪实体,因此调用此方法会抛出异常“ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象。”
我通过在Query方法中禁用实体跟踪解决了这个问题,如下所示:
public IQueryable<T> Query<T>() where T : class
{
return Set<T>().AsNoTracking();
}