【问题标题】:AutoMapper sets EF Core entities to detach stateAutoMapper 将 EF Core 实体设置为分离状态
【发布时间】:2022-11-09 19:14:29
【问题描述】:

当我使用 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();

}

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

【问题讨论】:

  • 从理论上讲,它应该在没有分配的情况下工作。你试过_mapper.Map(UsersInput, users); 吗?
  • 你是对的,但这不会改变任何事情。
  • 我从未尝试过将 (src,dest) 映射器调用与集合一起使用...我非常怀疑这是否能可靠地知道将哪个源元素与哪个目标元素进行映射。我建议遍历修改后的列表,从用户那里获取实体并在循环中使用_mapper.Map(modified, entity),看看这是否会改变行为。

标签: c# entity-framework-core automapper


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多