映射DTO到ID为对象

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

我正在使用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的老板对象?任何帮助将不胜感激!

c# asp.net-core aspnetboilerplate
1个回答
0
投票

有一些问题在这里。首先,ID应该从请求URL是未来的,因为它唯一标识真实被修改的资源。这也使您不必做愚蠢的事情像GetBossIdByName。不仅需要一个不必要的查询,但它容易出错。 id是你是有原因的关键:它是独一无二的。名不区分。你可以有多个同名的老板。此外,你的名字列可能没有索引,这意味着这样的查询是浩大地更加低效。然后,用你的身份证,你应该查询相应Boss你的数据库,并映射到这个实例,而不是创建一个新的实例。最后,保存同一实例回数据库。然后,你不会有任何问题。

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