我发现
Attach()
有问题,因为标记所有需要修改的内容很棘手。例如,如果您更改的只是 Address 中的一个属性,其中 Address 为 builder.OwnsOne(org => org.Address)
,则它看不到它。
我的用例非常标准。读入没有跟踪的对象来填充表单。然后,当他们去保存(更新)时,需要更新该对象并保存它。但是,不使用原始对象,而是执行以下操作有什么缺点吗?在哪里使用跟踪 DbContext 再次读取对象进行更新然后保存?
public interface IPrimaryEntities
{
public int Id { get; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
public static async Task<T> ReloadEntityAsync<T>(this IQueryable<T> query, T entity) where T : IPrimaryEntities
{
var reloadedEntity = await query.FirstOrDefaultAsync(e => e.Id == entity.Id);
if (reloadedEntity == null)
{
throw new DbUpdateConcurrencyException($"{entity.GetType().Name} with Id={entity.Id} not found.");
}
if (!entity.RowVersion.SequenceEqual(reloadedEntity.RowVersion))
{
throw new DbUpdateConcurrencyException($"{entity.GetType().Name} with Id={entity.Id} has been modified by another user.");
}
return reloadedEntity;
}
修改实体后,将其保存到数据库非常简单:在保存之前,您必须将其状态设置为“已修改”。例如:
var reloadedEntity =等待query.FirstOrDefaultAsync(e => e.Id ==实体.Id);
reloadedEntity.Address = yourForm.Address;
DbContext.Entry(reloadedEntity).State = EntityState.Modified;
DbContext.SaveChanges();