Ho una app .NET Core 2.1 per console che utilizza EF Core 2.1. Parla con un database per leggere e inserire righe. Questo database viene aggiornato anche da altre applicazioni contemporaneamente.
I problemi che ho incontrato sono: creo una riga dalla mia app per console, quindi un'app esterna elimina questa riga, quindi quando cerco nuovamente di inserire la riga con le stesse chiavi primarie, eseguo l'eccezione seguente:
L'istanza del tipo di entità "XYZ" non può essere rintracciata perché un'altra traccia con il valore chiave '{ID: 11, ABC: 136, DEF: 97}' è già stata tracciata. Quando si allegano entità esistenti, assicurarsi che sia collegata solo un'istanza di entità con un determinato valore di chiave.
Di seguito è il mio codice
var entity = PopulateValuesFor(XYZ);
var existingXYZ = _Context.TABLE1
.Include(r => r.TABLE2)
.Include(r => r.TABLE3)
.AsNoTracking()
.FirstOrDefault(r => r.Id == 1234);
if (existingXYZ == null)
{
_Context.Add(entity);
}
Il flusso è
Come faccio a comunicare a DbContext che l'entità non è più nel database ... svuota le voci e aggiungi nuovamente questa riga al database? Poiché si tratta di un'app console, viene utilizzata solo 1 istanza di DbContext, che viene iniettata nella classe che implementa questo metodo.
Sembra che tu abbia un contesto statico di lunga vita. Suggerirei di avvolgere quanto sopra in una dichiarazione usando e andando per un contesto di breve durata. In questo modo il tuo contesto non penserà già alla sua entità inserita.