[英]The instance of entity type cannot be tracked
你好社区 我在尝试编辑模型时遇到问题,它告诉我我正在尝试复制主键,但我不知道为什么会发生这种情况。
错误 System.InvalidOperationException:无法跟踪实体类型 'Cotizacion' 的实例,因为已跟踪 {'CotizacionId'} 具有相同键值的另一个实例。 附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
这是我的控制器代码:
[HttpPut]
public async Task<ActionResult> Put(Cotizacion cotizacion)
{
var cotizacionoriginal = context.Cotizaciones.Where(x => x.CotizacionId == cotizacion.CotizacionId).FirstOrDefault();
cotizacionoriginal = cotizacion;
context.Update(cotizacion);
context.SaveChanges();
return NoContent();
}
这是我的模型 cotizacion:
public class Cotizacion
{
[Key]
public Guid CotizacionId { get; set; }
public Guid InquilinoId { get; set; }
public int Folio { get; set; }
public DateTime? FechaCotizacion { get; set; }
public DateTime? FechaVencimiento { get; set; }
public DateTime? FechaCreacion { get; set; }
public DateTime? FechaModificacion { get; set; }
public bool EsBorrador { get; set; }
public double Total { get; set; }
public string Comentario { get; set; }
public bool Aceptada { get; set; }
public Guid CarritoId { get; set; }
public Guid ClienteId { get; set; }
public Guid? DireccionId { get; set; }
public Guid? ContactoId { get; set; }
public virtual Carrito Carrito { get; set; }
public virtual Cliente Cliente { get; set; }
public virtual Direccion Direccion { get; set; }
public virtual Contacto Contacto { get; set; }
}
这是我的模特客户:
public class Cliente
{
public Guid ClienteId { get; set; }
public Guid InquilinoId { get; set; }
[Required(ErrorMessage = "El campo {0} es requerido")]
public string Nombre { get; set; }
[Required(ErrorMessage = "El campo Razón Social es requerido")]
public string Razon_social { get; set; }
[Required(ErrorMessage = "El campo {0} es requerido")]
public string Rfc { get; set; }
[Required(ErrorMessage = "El campo {0} es requerido")]
public string Email { get; set; }
public int Telefono { get; set; }
public int Celular { get; set; }
public bool Es_Cliente { get; set; }
public bool Es_Proveedor { get; set; }
public virtual List<Contacto> Contacto { get; set; } = new List<Contacto>();
public virtual List<Direccion> Direccion { get; set; } = new List<Direccion>();
public virtual List<ClienteTipodeConcepto> ClienteTipodeConcepto { get; set; } = new List<ClienteTipodeConcepto>();
public virtual List<ClienteConcepto> ClienteConcepto { get; set; } = new List<ClienteConcepto>();
public virtual Cliente Empresa { get; set; }
}
这是我的模型卡里托:
public class ArticuloCarrito
{
[Key]
public Guid ArticuloCarritoId { get; set; }
public Guid ProductoId { get; set; }
public int Cantidad { get; set; }
public decimal PrecioPublico { get; set; }
public decimal Total// { get; set; }
{
get
{
return PrecioPublico * Cantidad;
}
}
public virtual Carrito Carrito { get; set; }
public virtual Producto Producto { get; set; }
}
public class Carrito
{
[Key]
public Guid CarritoId { get; set; }
public virtual ICollection<ArticuloCarrito> Articulos { get; set; }
public decimal Subtotal
{
get
{
decimal total = 0;
if (Articulos is null)
{
total = 0;
}
else
{
foreach (var item in Articulos)
{
total += item.Total;
}
}
return total;
}
}
public decimal IVA
{
get
{
double sub = Convert.ToDouble(Subtotal);
return (Convert.ToDecimal(sub * .16));
}
}
public decimal Total
{
get
{
double sub = Convert.ToDouble(Subtotal);
return (Convert.ToDecimal(sub * 1.16));
}
}
public DateTime UltimoAcceso { get; set; }
public int TiempoDeVidaEnSegundos { get; set; } = 1800;
}
还可以尝试这样的端点:
[HttpPut]
public async Task<ActionResult> Put(Cotizacion cotizacion)
{
var cotizacionDB = await context.Cotizaciones.FirstOrDefaultAsync(x => x.CotizacionId == cotizacion.CotizacionId);
if (cotizacionDB == null) { return NotFound(); }
cotizacionDB = mapper.Map(cotizacion, cotizacionDB);
await context.Database.ExecuteSqlInterpolatedAsync($"delete from Cotizaciones WHERE CotizacionId = {cotizacion.CotizacionId};");
cotizacionDB.Cliente = cotizacion.Cliente;
cotizacionDB.Carrito = cotizacion.Carrito;
await context.SaveChangesAsync();
return NoContent();
}
但它没有用
我的新尝试:
[HttpPut]
public async Task<ActionResult> Put(Cotizacion cotizacion)
{
var cotizacionoriginal = context.Cotizaciones.Where(x => x.CotizacionId == cotizacion.CotizacionId).FirstOrDefault();
cotizacionoriginal.Carrito= cotizacion.Carrito;
if (cotizacionoriginal != null)
{
context.Entry(cotizacionoriginal).State = EntityState.Detached;
}
context.Entry(cotizacion).State = EntityState.Modified;
await context.SaveChangesAsync();
return NoContent();
}
您遇到此问题的原因是控制器中的代码。 在这条线上,您正在跟踪 Cotizacion 实体
var cotizacionoriginal = context.Cotizaciones.Where(x => x.CotizacionId == cotizacion.CotizacionId).FirstOrDefault();
在这一行,您正试图跟踪另一个具有相同键值的 Cotizacion 实体。
context.Update(cotizacion);
基本上,您可以通过三种方式来处理这个问题。
选项 #1分离本地条目并附加更新的条目:
var cotizacionoriginal = context.Cotizaciones.Where(x => x.CotizacionId == cotizacion.CotizacionId).FirstOrDefault();
// check if local is not null
if (cotizacionoriginal != null)
{
// detach
_context.Entry(cotizacionoriginal).State = EntityState.Detached;
}
// set Modified flag in your entry
_context.Entry(cotizacion).State = EntityState.Modified;
// save
_context.SaveChanges();
选项 #2更新要更改的单个属性
[HttpPut]
public async Task<ActionResult> Put(Cotizacion cotizacion)
{
var cotizacionoriginal = context.Cotizaciones.Where(x => x.CotizacionId == cotizacion.CotizacionId).FirstOrDefault();
cotizacionoriginal.Folio = cotizacion.Folio;
cotizacionoriginal.Total = cotizacion.Total; //Continue as required
context.Update(cotizacionoriginal );
context.SaveChanges();
return NoContent();
}
选项 #3如果保证它永远存在并且永远不会导致任何问题,只需更新该值(不推荐)
[HttpPut]
public async Task<ActionResult> Put(Cotizacion cotizacion)
{
context.Update(cotizacion);
context.SaveChanges();
return NoContent();
}
如果您还尝试更新 Cotizacion 类型内的项目(例如 Cliente 内的 Nombre),那么这将不起作用。 您可以在 Cotizacion 中更新对 Cliente 的引用,但为了更新子项,您需要单独执行这些子项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.