【发布时间】:2018-05-25 04:07:43
【问题描述】:
我很难弄清楚如何更新集合。
这是我的模特
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) 我从对象 oldProgramacionSemanal 中的 db 获取所有信息
3) 调用 _mapper.map 后,对象信息 oldProgramacionSemanal 被修改,关系值设置为 null,但 Cliente
5) 当它试图保存对象时,我得到这个错误
{System.InvalidOperationException:无法跟踪实体类型“ProgramacionSemanalDetalle”的实例,因为已在跟踪另一个具有键值“{ProgramacionSemanalDetalleId: 38}”的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap
1.ThrowIdentityConflict(InternalEntityEntry entry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap1.Add(TKey 键,InternalEntityEntry 条目,布尔更新重复) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry 条目) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState entityState, Boolean acceptChanges, Nullable1 forceStateWhenUnknownKey) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node, Boolean force) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode node, TState state, Func3 handleNode) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.AttachGraph(InternalEntityEntry rootEntry,EntityState entityState,布尔 forceStateWhenUnknownKey) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.NavigationCollectionChanged(InternalEntityEntry 条目,INavigation 导航,IEnumerable1 added, IEnumerable1 已删除) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntryNotifier.NavigationCollectionChanged(InternalEntityEntry 条目,INavigation 导航,IEnumerable1 added, IEnumerable1 已删除) 在 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() 在 Microsoft.EntityFrameworkCore.DbContext.TryDetectChanges() 在 Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(布尔型 acceptAllChangesOnSuccess,CancellationToken cancelToken) 在 C:\gleintech\GasApp\GasApp.Data\GasRepository.cs:line 37 中的 GasApp.Data.GasRepository.SaveAllAsync() 在 GasApp.Controllers.ProgramacionSemanalController.Put(Int32 programacionSemanalId, ProgramacionSemanalViewModel 模型) 在 C:\gleintech\GasApp\GasApp\Controllers\ProgramacionSemanalController.cs:line 171}
有人可以就我做错了什么给我任何建议吗?
阿尔伯托
【问题讨论】:
-
在 ProgramacionSemanalI 的 ProgramacionSemanalId 上放置 [key] 属性有帮助吗?
-
您能找出问题所在吗?如果有,你是怎么处理的?我面临着类似的问题。谢谢
标签: asp.net-core automapper ef-core-2.0