簡體   English   中英

無法跟蹤實體類型的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM