Отображение Dto на объект с идентификатором - PullRequest
0 голосов
/ 08 февраля 2019

Я делаю приложение, используя платформу ASP.Net Boilerplate, и на моем доменном уровне у меня есть простая сущность "Boss".Создание и извлечение этих объектов из базы данных работает нормально, но я не могу заставить работать «Обновление».Когда я сопоставляю «UpdateBossDto» с объектом Boss и пытаюсь обновить его, я получаю эту ошибку:

$ exception {System.InvalidOperationException: экземпляр типа сущности 'Boss' не может быть отслежен, поскольку другой экземплярс тем же значением ключа для {'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);
    } 
}

Вот мой метод Update в BossAppService (я знаю, что получить идентификатор таким образом, вероятно, не очень хорошо, но сейчас я просто в отчаянии):

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; }
}

Как я могу обновить объект боссов с идентификатором или без него? Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 08 февраля 2019

Здесь есть ряд проблем.Во-первых, идентификатор должен исходить из URL-адреса запроса, поскольку он однозначно идентифицирует ресурс, который изменяется.Это также избавляет вас от необходимости делать глупости, такие как GetBossIdByName.Это не только требует ненужного запроса, но и подвержено ошибкам.Идентификатор - это ваш ключ по причине: он уникален.Имена нет.Вы можете иметь несколько боссов с одним именем.Кроме того, ваши столбцы имен, вероятно, не проиндексированы, что означает, что такой запрос является гораздо более неэффективным.Затем с вашим идентификатором вы должны запросить соответствующий Boss из вашей базы данных и отобразить на этого экземпляра, а не создавать новый экземпляр.Наконец, сохраните этот же экземпляр обратно в базу данных.Тогда у вас не будет проблем.

...