调用.CurrentValues.SetValues后,数据不会更新

时间:2014-11-04 06:58:43

标签: c# asp.net-mvc database entity-framework generics

目前,我在我的通用存储库中实现了此更新功能

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”相同。但是数据库中的数据没有更新。如果您有任何解决方案,请提供帮助。

1 个答案:

答案 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();
    }