AutoMapper 将 EF Core 实体设置为分离状态

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

当我使用 AutoMapper 将输入模型与数据库实体映射时,实体状态更改为“分离”,这意味着更改不会保存到数据库中。

CreateMap<User, UserInput>().ReverseMap();

添加/更新:

[BindProperty]
public IList<UserInput> UsersInput { get; set; }

public async Task<PageResult> OnGetAsync()
{

    var users = await _dbContext.Users.ToListAsync();
    UsersInput = _mapper.Map<List<UsersInput>>(signers);

    return Page();

}

public async Task<IActionResult> OnPostAsync()
{

    var users = await _dbContext.Users.ToListAsync();

    foreach (var u in users)
    {
        Console.WriteLine(_dbContext.Entry(u).State); // => Unchanged
    }

    users = _mapper.Map(UsersInput, users);

    foreach (var u in users)
    {
        Console.WriteLine(_dbContext.Entry(u).State); // => Detached
    }

    // Save and return

    await _dbContext.SaveChangesAsync(); // => Nothing is saved because entities are Detached

    return Page();

}

这与我映射数据的方式有关吗?

c# entity-framework-core automapper
2个回答
0
投票

只要

UsersInput
具有与 Users 表中的 id 相对应的 id,那么就没有理由从数据库加载任何内容。只需使用 EF Core
UpdateRange()
方法即可:

public async Task<IActionResult> OnPostAsync()
{
    var users = _mapper.Map<List<User>>(UsersInput);
    _dbContext.Users.UpdateRange(users);
    await _dbContext.SaveChangesAsync();
    return Page();
}

0
投票

这是一篇旧文章,但我也遇到了类似的问题。 我有一个实体,我使用映射器来更改某些列,但我还需要手动更改其他列。 实体从映射器返回后,它与数据库分离,但 ef 仍在跟踪具有相同 id 的实体。任何更改状态的尝试都会导致错误:“已经有一个具有相同 id 的实体正在被跟踪”。 我的伪代码解决方案如下:

var entity = await db.Mytables.AsNoTracking().Where (m=>mi.d == myid).FirstorDefaultAsync();
entity2 = mapper.Map<Mytable1, MyTable>(entity); 
.... make some more changes to entity 2
//then attach the entity
 var entry = db.Entry(entity);
dbw.MyTables.Attach(entity);
entry.State = EntityState.Modified;
  var succ =   await _db.SaveChangesAsync();
© www.soinside.com 2019 - 2024. All rights reserved.