Я с трудом пытаюсь понять, как обновить коллекцию.
Это моя модель
public class ProgramacionSemanal
{
public int ProgramacionSemanalId { get; set; }
public int Semana { get; set; }
public DateTime FechaInicio { get; set; }
public DateTime FechaFin { get; set; }
public ICollection<ProgramacionSemanalDetalle> ProgramacionSemanalDetalles { get; set; }
}
public class ProgramacionSemanalDetalle
{
[Key]
public int ProgramacionSemanalDetalleId { get; set; }
public int ProgramacionSemanalId { get; set; }
[Column("ClienteId")]
public Entidad Cliente { get; set; }
public int UbicacionId { get; set; }
public Ubicacion Ubicacion { get; set; }
public int ProductoId { get; set; }
public Producto Producto { get; set; }
public int Lunes { get; set; }
public int Martes { get; set; }
public int Miercoles { get; set; }
public int Jueves { get; set; }
public int Viernes { get; set; }
public int Sabado { get; set; }
public int Domingo { get; set; }
public AppUsuario Usuario { get; set; }
}
Это маршрут в моем API.
[HttpPut("{programacionsemanalId}")]
public async Task<IActionResult> Put(int programacionSemanalId, [FromBody] ProgramacionSemanalViewModel model)
{
try
{
var oldProgramacionSemanal = await _repository.GetProgramacionSemanalAsync(programacionSemanalId);
if (oldProgramacionSemanal == null) return NotFound($"No se encontro la Programación Semanal.");
_mapper.Map(model, oldProgramacionSemanal);
var currentUser = await _userManager.FindByNameAsync(User.Identity.Name);
foreach (var item in oldProgramacionSemanal.ProgramacionSemanalDetalles)
{
var producto = await _repository.GetProductoAsync(item.ProductoId);
if (producto == null) return BadRequest();
item.Producto = producto;
var ubicacion = await _repository.GetUbicacionAsync(item.UbicacionId);
if (ubicacion == null) return BadRequest();
item.Ubicacion = ubicacion;
item.Usuario = currentUser;
}
if (await _repository.SaveAllAsync())
{
return Ok(_mapper.Map<ProgramacionSemanalViewModel>(oldProgramacionSemanal));
}
}
catch (Exception ex)
{
_logger.LogError($"Threw exception while updating: {ex}");
}
return BadRequest("Couldn't update");
}
Я думаю, что все работает правильно,
1)Я получил всю информацию, определенную в модельном объекте.
2) Я получаю всю информацию из db в объекте oldProgramacionSemanal
3) После вызова _mapper.map, информация об объекте oldProgramacionSemanal изменяется, значения отношений устанавливаются в ноль, но Cliente
4) Я просматриваю объекты коллекции и обновляю значение отношения
5) При попытке сохранить объект,Я получаю эту ошибку
{System.InvalidOperationException: экземпляр типа сущности 'ProgramacionSemanalDetalle' не может быть отслежен, поскольку другой экземпляр со значением ключа '{ProgramacionSemanalDetalleId: 38}' уже отслеживается.При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа.в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap 1.ThrowIdentityConflict(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap
1.Добавить (ключ TKey, запись InternalEntityEntry, логическое updateDuplicate) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking (InternalEntityEry.EntineEntineEntworkEnt.EntityEnt.EctionCity.EntityEnt..InternalEntityEntry.SetEntityState (EntityState oldState, EntityState newState, Boolean acceptChanges) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState (EntityState entityState.AttachGraph (InternalEntityEntry rootEntry, EntityState entityState, логическое значение forceStateWhenUnknownKey) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.NavigationCollectionChanged (запись InternalEntityEntry.InternalIntern.travel 1)rnalEntityEntryNotifier.NavigationCollectionChanged (InternalEntityEntry вход, INavigation навигация, IEnumerable * * 1 тысячу тридцать-одна удалены) при Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectNavigationChange (InternalEntityEntry входа, INavigation навигации) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectChanges (InternalEntityEntryзапись) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectChanges (IStateManager stateManager) в Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.DetectChanges () в Майкрософт.EntityFrameworkxtan.ChangeCeteCtraEFeCityEteCateEF_Ext_TeF_TeKTe_EcTe_TeKeTeKeTe_Te_TeKTeTeTeTeTeKTeTeTeTeTeKeTeTeTeTTTTTTTTTTTTTTTTTTTTTBTBTBTBTBBB), содержащуюся в записи Microsoft).acceptAllChangesOnSuccess, CancellationToken CancellationToken) в GasApp.Data.GasRepository.SaveAllAsync () в C: \ gleintech \ GasApp \ GasApp.Data \ GasRepository.cs: линия 37 в GasApp.Controllers.ProgramacionSeganalControlSonellShellв C: \ gleintech \ GasApp \ GasApp \ Controllers \ ProgramacionSemanalController.cs: строка 171}
Кто-нибудь может дать мне какой-либо совет, что я делаю неправильно?
Альберто