Имея эти две сущности, я выбираю их, отображаю их в 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» для просмотра конфликтующих значений ключа. "
ВОПРОС - правильно ли я обновляю дочерние объекты или это что-то еще?