替换 DbContext.Attach()

问题描述 投票:0回答:1

我发现

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;
}
entity-framework entity-framework-core
1个回答
0
投票

修改实体后,将其保存到数据库非常简单:在保存之前,您必须将其状态设置为“已修改”。例如:

var reloadedEntity =等待query.FirstOrDefaultAsync(e => e.Id ==实体.Id);

reloadedEntity.Address = yourForm.Address;

DbContext.Entry(reloadedEntity).State = EntityState.Modified;

DbContext.SaveChanges();

© www.soinside.com 2019 - 2024. All rights reserved.