Come è possibile bloccare una riga in lettura con EF Core? Ho trovato una soluzione semplice con TransactionScope
ma non sembrano funzionare (classe non trovata)
Il problema è quando si elimina un elemento, cosa che faccio in una discussione, e premere due volte il pulsante Elimina, l'elemento non è lì la seconda volta, quindi ottengo un'eccezione.
La mia prima soluzione era verificare se l'elemento è ancora lì, ma siccome il metodo è chiamato come task, il controllo viene eseguito da entrambe le attività prima che uno di loro lo cancelli. Quindi avrei bisogno di bloccare questa riga per bloccare la seconda attività dalla produzione di un errore.
Naturalmente, una soluzione rapida e sporca dovrebbe essere tentata con una presa vuota, ma preferirei gestirla in modo pulito.
Un'altra opzione è semplicemente non usare EF per le operazioni di cancellazione.
Se si esegue il DELETE TableName WHERE PrimaryKey = @Key
SQL DELETE TableName WHERE PrimaryKey = @Key
e il record è stato già eliminato, non si otterrà un errore.
azzimato
using (var sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring))
{
sqlConnection.Open();
string sqlQuery = "DELETE FROM [dbo].[Customer] WHERE CustomerId=@CustomerId";
sqlConnection.Execute(sqlQuery, new {customerId});
sqlConnection.Close();
}
Catena Tortuga
dataSource.DeleteByKey ( "Customer", CustomerId).Execute();
EF
using (var context = new [...]) {
context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Customer] WHERE CustomerId=@CustomerId", new SqlParameter("@CustomerId", CustomerId));
}
(Sì, usare EF per eseguire una query non EF è uno spreco, ma è un'opzione.)
Sento che dovresti sempre proteggere le tue ef queries in try / catch ogni volta che stai causando INSERT, UPDATE o DELETE, poiché puoi attivare eccezioni in varie condizioni di routine come le violazioni delle chiavi esterne, record non trovati, ecc. Tale eccezione dovrebbe essere considerata come errore, ma non fatale, quindi dovrebbe essere gestito. Quindi alla tua domanda non viene risposto come evitare un'eccezione, ma assicurandoti che non ti sorprenda.