对于具有不同引用的实体,将“实体状态”设置为“已修改”

时间:2018-12-22 09:05:41

标签: c# wpf entity-framework automapper

我正在使用MVVM模式在WPF应用程序上工作,而且我首先对数据库实体使用EF代码。并且由于MVVM,我使用AutoMapper将对象从数据库“模型”映射到“ ViewModels”。

更新实体时,我必须将其从视图模型映射回模型并传递给更新方法

public void Update(TEntity entity)
{   
    TEntity databaseEntity = Context.Set<TEntity>().Find(entity.Id);
    DbEntityEntry dbEntityEntry = Context.Entry(databaseEntity);
    dbEntityEntry.CurrentValues.SetValues(entity);  
    dbEntityEntry.State = EntityState.Modified;
}

这里的问题是每次我要更新实体时都必须获取该实体,如果我有许多对象要更新,则会导致性能问题。我尝试使用以下代码,但由于自动映射器创建的实体的新实例与EF dbConext附带的实例不同而无法正常工作。

public void Update(TEntity entity)
{
    DbEntityEntry<TEntity> dbEntityEntry = Context.Entry(entity);
    dbEntityEntry.State = EntityState.Modified;
}

我试图通过覆盖Equals和GetHashCode方法来处理此问题,但它也没有起作用。

有什么方法可以处理更新实体而不将其从数据库中获取?

谢谢。

1 个答案:

答案 0 :(得分:0)

由于您正在手动跟踪更改,因此不应保留对同一dbcontext的引用。在Using语句内读取数据,该语句会发出消息并处理dbcontext。 当您将数据写回新实体时,请将属性设置为视图模型中的属性,将其状态设置为Modifyed并保存更改。 再次,打开并关闭您的dbcontext。
这样就无需去查找您阅读的实体。

这是一个琐碎的例子,以防解释不清楚。 这并不代表最佳实践企业解决方案-我希望至少有一个通用的updateentityasync方法。 我们正在更新人员表中的人员。

    public async Task<bool> UpdatePersonAsync(Person person)
    {
        int numUpdated = 0;
        using (var db = new AndyPeopleContext())
        {
            db.People.Add(person);
            db.Entry(person).State = EntityState.Modified;
            numUpdated = await db.SaveChangesAsync();
        }
        return numUpdated == 1;
    }