当我使用 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();
}
这与我映射数据的方式有关吗?
只要
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();
}
这是一篇旧文章,但我也遇到了类似的问题。 我有一个实体,我使用映射器来更改某些列,但我还需要手动更改其他列。 实体从映射器返回后,它与数据库分离,但 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();