Не удается обновить дочерние объекты в моем контроллере с помощью ядра платформы - PullRequest
1 голос
/ 24 января 2020

Имея эти две сущности, я выбираю их, отображаю их в viwemodels / dtos, прежде чем передать их в пользовательский интерфейс. Мне также пришлось игнорировать обработку ссылки l oop в моем файле startup.cs, чтобы правильно сопоставить их с DTO.

public class Matter
{
    public int Id { get; set; }
    public ICollection<MatterExposure> Exposures { get; set; }
    // other properties
}
public class MatterExposure
{
     public int Id { get; set; }
     public Matter Matter { get; set; }
     // other properties
}

Когда я сохраняю форму (которая включает в себя таблицу 'MatterExposure's) в Пользовательский интерфейс Я передаю все обратно в контроллер, чтобы сохранить. INFO - пока не сохраняются дочерние сущности 'MatterExposure' в приведенном ниже вызове контроллера, и он отлично работает!

[HttpPut("{id}")]
public async Task<IActionResult> UpdateData(string id, MatterForClaimDetailedDto generalMatterDto)
{
    var user = await _userManager.GetUserAsync(HttpContext.User);
    var matter = await _autoRepo.GetMatter(id);
    // fill some matter data and add a child then save and it works fine 
    if (await _autoRepo.SaveAll())
            return NoContent(); 
}
public class MatterForClaimDetailedDto
{
    public int Id { get; set; }
    public GeneralMatterDto MatterData { get; set; }
    public ICollection<MatterExposure> Exposures { get; set; }
    // other properties
}

Теперь я хочу добавить обновление сущностей MatterExposure, как я мог бы сделать изменения к ним в пользовательском интерфейсе. Поэтому я пытаюсь использовать UpdateRange следующим образом

[HttpPut("{id}")]
public async Task<IActionResult> UpdateData(string id, MatterForClaimDetailedDto generalMatterDto)
{
    var user = await _userManager.GetUserAsync(HttpContext.User);
    var matter = await _autoRepo.GetMatter(id);
    matter.EditedDate = DateTime.Now;
    matter.FirstName = generalMatterDto.FirstName;
    matter.LastName = generalMatterDto.LastName;

    _autoRepo.UpdateRange<List<MatterExposure>>(generalMatterDto.Exposures.ToList());
    await _autoRepo.SaveAll()
}
public void UpdateRange<T>(T entity) where T : class
{
    _autoContext.UpdateRange(entity);
}

Но при вызове UpdateRange я получаю следующее сообщение об исключении:

"Тип сущности 'List MatterExposure' не найден. Убедитесь, что тип сущности был добавлен в модель. "

В моем контексте у меня есть это:

public DbSet<MatterExposure> MatterExposure { get; set; }

Затем я попытался без удачи

public DbSet<List<MatterExposure>> MatterExposure { get; set; }

Я подумал, что попробую обновить каждую отдельную сущность 'MatterExposure', чтобы посмотреть, изменит ли это что-нибудь. Поэтому я попытался удалить вызов UpdateRange и попытался с отдельными сущностями 'MatterExposure'

  foreach(var exposure in generalMatterDto.Exposures) {
      _autoRepo.Update<MatterExposure>(exposure);
   }
   // in my repo I have this with different things I tried
   public void Update<T>(T entity) where T : class
    {
        // _autoContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
        //_autoContext.Entry(entity).State = EntityState.Detached;
        _autoContext.Update(entity);
       // _autoContext.ChangeTracker.
    }

На первом l oop через каждый вызов обновления 'MatterExposure' к репо я получаю это исключение

"Экземпляр типа сущности 'MatterExposure' не может быть отслежен, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что только один экземпляр сущности с данным ключом значение прикреплено. Попробуйте использовать 'DbContextOptionsBuilder.EnableSensitiveDataLogging', чтобы увидеть конфликтующие ключевые значения. "

После исключения, которое я попытался, я поставил l oop в верхней части метода контроллера, чтобы увидеть если другой объект сущности вмешивался.

// at top of controler method before the other entity actions are performed
foreach(var exposure in generalMatterDto.Exposures) {
    _autoRepo.Update<MatterExposure>(exposure);
}

И перемещение for l oop в верхнюю часть контроллера проходит через 1-ю итерацию, но затем завершается неудачей на второй, снова выдавая мне то же сообщение об ошибке

"Экземпляр типа сущности 'MatterExposure' не может быть отслежен, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с данным значением ключа Попробуйте использовать «DbContextOptionsBuilder.EnableSensitiveDataLogging» для просмотра конфликтующих значений ключа. "

ВОПРОС - правильно ли я обновляю дочерние объекты или это что-то еще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...