我正在使用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方法来处理此问题,但它也没有起作用。
有什么方法可以处理更新实体而不将其从数据库中获取?
谢谢。
答案 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;
}