我正在使用ASP.Net样板框架的应用程序,并在我的领域层中我有一个简单的“老板”的实体。创建并从数据库中检索这些实体工作正常,但我不能得到“更新”工作。当我的“UpdateBossDto”映射到老板对象,并尝试更新它,我得到这个错误:
$ {异常System.InvalidOperationException:实体型“老板”的情况下无法被追踪,因为与{“ID”}相同键值的另一个实例已被跟踪。当附接的现有实体,确保只有一个具有给定键值的实体实例附着。请考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”看到冲突的键值。
这个错误被在BossManager类抛出(我已删除了可读性的其他方法。
public class BossManager : DomainService, IBossManager
{
private readonly IRepository<Boss> _repositoryBoss;
public BossManager(IRepository<Boss> repositoryBoss)
{
_repositoryBoss = repositoryBoss;
}
public void Update(Boss entity)
{
_repositoryBoss.UpdateAsync(entity);
}
}
这是在我的BossAppService Update方法(我知道获得标识这种方式可能不是很大,但现在我只是绝望):
public void Update(UpdateBossDto updatedBoss)
{
var boss = new Boss();
updatedBoss.Id = _bossManager.GetBossIdByName(updatedBoss.Name);
boss = ObjectMapper.Map<Boss>(updatedBoss);
_bossManager.Update(boss);
}
而我UpdateDto类持有相同的属性老板类本身:
public class UpdateBossDto
{
public int Id { get; set; }
public string Name { get; set; }
public int Hp { get; set; }
public int CombatLvl { get; set; }
public int MaxHit { get; set; }
public string AttackStyle { get; set; }
public string Weakness { get; set; }
public string ImageUrl { get; set; }
}
如何更新有或没有该ID的老板对象?任何帮助将不胜感激!
有一些问题在这里。首先,ID应该从请求URL是未来的,因为它唯一标识真实被修改的资源。这也使您不必做愚蠢的事情像GetBossIdByName
。不仅需要一个不必要的查询,但它容易出错。 id是你是有原因的关键:它是独一无二的。名不区分。你可以有多个同名的老板。此外,你的名字列可能没有索引,这意味着这样的查询是浩大地更加低效。然后,用你的身份证,你应该查询相应Boss
你的数据库,并映射到这个实例,而不是创建一个新的实例。最后,保存同一实例回数据库。然后,你不会有任何问题。