对于我的更新操作,我的控制器操作执行如下操作:
public Task<IHttpActionResult> Update(int id, CustomerTypeDto customerTypeDto)
{
var entity = customerTypeService.Get(id);
entity.Number = customerTypeDto.Number;
entity.Description = customerTypeDto.Description;
entity = customerTypeService.Save(entity);
return Ok<CustomerTypeDto>(Mapper.Map<CustomerTypeDto>(entity));
}
这是一个简单的例子,它包含一个由2个属性组成的简单实体。我的大多数实体都是具有大量属性和深层关系的复杂实体。
我需要先从数据库加载实体,以便它开始被上下文跟踪。我设置了属性,然后将更新的实体保存回数据库。存储库的更新方法如下所示:
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = dataContext.GetEntry(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
dbSet.Attach(entity);
dbEntityEntry.State = EntityState.Modified;
}
}
执行上述操作,EF正确创建并更新仅包含更改属性的SQL语句。
使用Automapper,是否可以在从db加载后将dto类映射到模型,以便在映射发生时跟踪更改?
而不是:
entity.Number = customerTypeDto.Number;
entity.Description = customerTypeDto.Description;
是否可以这样做:
entity = Mapper.Map(customerTypeDto, entity);
如果无法做到这一点,除了设置个别属性外还有哪些其他选择?也许使用GraphDiff或此Delta implemenation?