繁体   English   中英

实体未使用“代码优先”方法更新

[英]Entity not updating using Code-First approach

我有用于数据库操作的此类:

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----
}

在此类中,还有其他方法可以使insertget工作正常。 仅此更新方法不会更新实体,也不会引发异常。

更新

我面临类似的问题,但在此处的功能却相反: Add()方法为代码优先实体框架中的链接模型添加重复的行

我认为这两个原因具有相同的变更跟踪。 但是一个正在添加另一个并没有更新。

线...

var dbEnt = _context.Set<TEntity>().Where(c => c.Id == entity.Id).First();

...将实体对象附加到上下文并返回对该实体的引用。

那行...

dbEnt = entity;

...用对进入方法的entity变量的引用代替此引用。 不是被跟踪的实体对象 您基本上失去了对跟踪实体的引用,并且无法再对其进行更改。

您应该将entity附加到上下文并将其标记为已修改,或者像已经那样获取dbEnt并修改并保存对象。 两种方法各有利弊,请参见此处

从_context获取实体后,从新的详细信息更新所有字段并将实体状态设置为已修改

var dbEnt = _context.Set<TEntity>().Where(c => c.Id == entity.Id).First();
dbEnt.Name = entity.Name;
...
...
...
dbEnt.UpdatedBy = GetCurrentUser();
dbEnt.DateUpdated = DateTime.Now;
_context.Entry(dbEnt).State = EntityState.Modified;
_context.SaveChanges();

如果您通过ID找到了自己的实体

var dbEnt = _context.Set<TEntity>().Where(c => c.Id == entity.Id).First();

那这行为什么呢?

dbEnt = entity;

删除上面的行,因为它将删除对跟踪对象的引用。

谢谢大家。 您的回答给我很多提示。 正如@GertArnold和@Colonel Software的回答提示我,我像这样修改了我的代码,它起作用了:

//Assigning BaseModel properties
entity.CreatedBy = dbEnt.CreatedBy;
entity.UpdatedBy = GetCurrentUser();
entity.DateUpdated = DateTime.Now;
entity.DateCreated = dbEnt.DateCreated;

//Changing entity states
_context.Entry(dbEnt).State = EntityState.Detached;
_context.Entry(entity).State = EntityState.Modified;

_context.SaveChanges();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM