[英]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----
}
在此类中,还有其他方法可以使insert
和get
工作正常。 仅此更新方法不会更新实体,也不会引发异常。
更新
我面临类似的问题,但在此处的功能却相反: 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.