实体框架:部分更新记录不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架:部分更新记录不起作用相关的知识,希望对你有一定的参考价值。

我有以下设置:

enter image description here注入所有实例,UnitOfWork和DataContext是单例。

我想对记录进行部分更新。在通用存储库中,我在更新语句中有以下代码:

dbSet.Attach(entity);
if (updatedProperties != null)
{
   foreach (var property in updatedProperties)
   {
      unitOfWork.DataContext.Entry<TEntity>(entity).Property(property).IsModified = true;
   }
}

在我的更新方法中,我接受带有更新字段的字符串列表。

使用以下代码从usermanager调用此方法:

userRepo.Update(origUser, updatedProperties);
if(processToDB)
{
    unitOfWork.SaveChanges();
}

变量processToDB设置为true。我进入代码,我在changetracker中看到实体在那里,但更新永远不会发生。

那么,是什么解决了这个问题,但是我没有发现这是一个很好的解决方案,直接从通用存储库中的Update方法调用SaveChanges方法:

dbSet.Attach(entity);
if (updatedProperties != null)
{
   foreach (var property in updatedProperties)
   {
      unitOfWork.DataContext.Entry<TEntity>(entity).Property(property).IsModified = true;
   }
   unitOfWork.SaveChanges(); //added
}

为什么在用户管理器上调用savechanges时它不起作用,它毕竟是相同的unitOfWork和DataContext(因为它们是单例)。

答案

您不需要为每个实体属性设置IsModified。使用AutoDetectChangesEnabled属性并设置为true,同时将EF模型初始化为

DbContext.Configuration.AutoDetectChangesEnabled = true;

它将使EF跟踪实体对象的变化。您可以使用unitOfWork.DataContext(entity).State == EntityState.Modifed进行检查。

如果满足上述条件,则更新您的实体。

以上是关于实体框架:部分更新记录不起作用的主要内容,如果未能解决你的问题,请参考以下文章

实体框架脚手架和迁移不起作用

实体框架 4 函数导入不起作用

实体框架代码优先 - 初始代码迁移不起作用

C# - 实体框架代码优先,延迟加载不起作用

实体框架可选的一对一关系不起作用

OptimisticConcurrencyException 在某些情况下在实体框架中不起作用