我有一个用于数据库操作的类:
public class EntityService<TEntity> : IRepository<TEntity> where TEntity : BaseModel
{
ApplicationDbContext _context;
private DbSet<TEntity> _entities;
public EntityService()
{
_context = new ApplicationDbContext();
}
public virtual void Update(TEntity entity)
{
if (entity == null)
throw new ArgumentNullException(nameof(entity));
try
{
var dbEnt = _context.Set<TEntity>().Where(c => c.Id == entity.Id).First();
dbEnt = entity;
dbEnt.UpdatedBy = GetCurrentUser();
dbEnt.DateUpdated = DateTime.Now;
_context.SaveChanges();
}
catch (DbUpdateException exception)
{
throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
}
//-----other methods for insert and get working fine----
}
该类中还有其他用于insert
和get
的方法工作正常。只有这个更新方法不更新实体并且不抛出异常。
更新
我面临着类似的问题,但在这里运作相反:Add() method adding duplicate rows for linked models in Code-First Entity Framework
我认为这两者具有相同的更改跟踪原因。但是一个是添加另一个不是更新。
最佳答案
这条线...
var dbEnt = _context.Set<TEntity>().Where(c => c.Id == entity.Id).First();
...将实体对象附加到上下文并返回对此实体的引用。
然后这条线...
dbEnt = entity;
...将此引用替换为对进入方法的 entity
变量的引用。那是不是被跟踪的实体对象。您基本上丢失了对被跟踪实体的引用,并且不可能再更改它。
您应该将 entity
附加到上下文并将其标记为已修改,或者像您已经做的那样获取 dbEnt
并修改并保存 that目的。两种方法各有利弊,参见 here .
关于c# - 实体不使用代码优先方法更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302611/