944 messaggi dal 11 febbraio 2013
ciao a tutti

in una applicazione ottengo questo errore nei log

System.InvalidOperationException: The instance of entity type 'RigheOrdine' cannot be tracked because another instance with the same key value for {'Id', 'CodartVar'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.


CodartVar è una chiave su sqlite per evitare che si inserisca (per chissa quale motivo) piu volte lo stesso articolo.

Googolando sembra che sia molto probabile che si riferisca ad update ... ma io non ne faccio:
se l'utente vuole modificare l'ordine lo elimino (solo in questo caso altrimenti faccio una soft delete) e poi lo reinserisco senza errori

Quando l'errore si verifica l'ordine viene salvato su localstorage e poi l'utente lo può ricaricare da un file excel
Aprendo il file excel gli articoli sono doppi


Cosa dovrei andare a vedere ?

grazie
Modificato da jjchuck il 06 ottobre 2020 10:08 -
144 messaggi dal 26 febbraio 2007
sembra che nel tuo DbContext sia già presente un entity con queste chiavi.

non è che hai fatto uan softdelete di quella chiave ed adesso la stai reinserendo? perchè a livello di db esiste comunque.
944 messaggi dal 11 febbraio 2013
No.
Grazie per avermi dato uno spunto ma non riesco a capire...
144 messaggi dal 26 febbraio 2007
riesci a postare qualche riga di codice, per vedere come gestisci recupero ed l'inserimento/modifica dell'entity su EFCore?
944 messaggi dal 11 febbraio 2013
public async Task<int> AddOrderAsync(CreateOrderModel model, User user)
        {
            int affectedRows = 0;
            var level = IsolationLevel.Serializable;
            using (var transaction = _ctx.Database.BeginTransaction(level))
            {
                try
                {
                    int lastId = await GetLastId();
                    Orders Orders = CreteOrders(model, lastId);
                    user.Orders.Add(Orders);

                    using (var crypto = new RNGCryptoServiceProvider())
                    {
                        int retries = 5;
                        do
                        {
                            var pk = crypto.CreateNumberBetween(100000000000000, 1000000000000000);
                            Orders.CodEst = pk;

                            foreach (var item in Orders.OrderItems)
                                item.RoaCodEst = pk;

                            try
                            {
                                affectedRows = await _ctx.SaveChangesAsync();
                            }
                            catch (DbUpdateException) when (--retries >= 0)
                            {
                            }
                            catch (Exception ex)
                            {
                                string[] parametri = new string[] { model.Codcli, model.Divisione, model.Codage };
                                if (affectedRows == 0) throw new OrderNotSavedException(ex, parametri);
                            }
                        } while (affectedRows == 0);
                    }

                    transaction.Commit();
                    return affectedRows;
                }
                catch (Exception ex)
                {
                    string[] parametri = new string[] { model.Codcli, model.Divisione, model.Codage };
                    throw new OrderNotSavedException(ex, parametri);
                }
            }
        }

private static Ordcli CreteOrders(CreateOrderModel model, int lastId)
        {
            return new Order
            {
                Id = 0000000000000000,
                Anno = model.Anno,
                ...,
                OrderItems = model.OrderItems.Select((item) => new Righe
                {
                    Id = lastId,
                    CodartVar = item.Codvar == null ? item.Codart : item.Codart + "/" + item.Codvar,
                    Codart = item.Codart,
                    Codvar = item.Codvar,
                    Descri = item.Descri,
                    Quanti = item.Quanti,
                    Prezzo = item.Prezzo,
                    Implor = item.Quanti * item.Prezzo,
                    Numrig = item.Numrig,
                    CodEst = 0000000000000000
                }).ToList()
            };
        }

public async Task DeleteOrder(long id)
        {
            var ordine = await _ctx.Ordine.SingleOrDefaultAsync(x => x.CodEst == id);
            _ctx.Ordcli.Remove(ordine);
            await _ctx.SaveChangesAsync();
        }
        public async Task SoftDelete(long id)
        {
            var ordine = await _ctx.Ordine.SingleOrDefaultAsync(x => x.CodEst == id);
            ordine.Deleted = 1;
            _ctx.Ordine.Update(ordine);
            await _ctx.SaveChangesAsync();
        }



Non faccio update ma solo insert e delete/soft-delete

Ho testato con una softdelete (cancellare l'ordine) e ha rifarlo uguale senza nessun errore
Modificato da jjchuck il 07 ottobre 2020 08:47 -
Modificato da jjchuck il 07 ottobre 2020 08:50 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.