[FIXED] Wie benutze ich Entity Framework -Transaktion in Rohabfrage?

Ausgabe

Ich verwende das Entity Framework, mache meine Operationen aber mit Rohabfragen. Meine Operationen sind wie folgt:

  1. Prüfen Sie, ob recırd mit integration_id existiert
  2. Datensatz löschen, wenn verlassen
  3. Neuen Datensatz einfügen

Also verwende ich Transaktion

using (var transaction = await _context.Database.BeginTransactionAsync())
{ 
        var isExist = await IsExist(id);

        if (isExist)
        {
              var deleteQuery = "delete from ....";
              await _context.Database.ExecuteSqlRawAsync(deleteQuery);
        }

        var insertQuery = "insert into ...";
        await _context.Database.ExecuteSqlRawAsync(insertQuery);
}

Wenn der Einfügevorgang fehlschlägt, wird der gelöschte Datensatz zurückgesetzt?

Lösung

UPD: https://learn.microsoft.com/en-us/ef/core/saving/transactions#controlling-transactions

Die Transaktion wird automatisch zurückgesetzt, wenn sie verworfen wird, wenn einer der Befehle fehlschlägt

Also, mein Code unten mag auf der Catch-Seite übertrieben sein, aber Commit ist immer noch wichtig 🙂

======================

Ich glaube, die richtige Art der Verwendung von Transaktionen wäre die folgende:

using (var transaction = await _context.Database.BeginTransactionAsync())
{
    try
    {
        var isExist = await IsExist(id);

        if (isExist)
        {
            var deleteQuery = "delete from ....";
            await _context.Database.ExecuteSqlRawAsync(deleteQuery);
        }

        var insertQuery = "insert into ...";
        await _context.Database.ExecuteSqlRawAsync(insertQuery);

        // there we tell DB to finish the transaction,
        // mark all changes as permanent and release all locks
        transaction.Commit();
    }
    catch (Exception ex)
    {
        // there we tell DB to discard all changes
        // made by this transaction that may be discarded
        transaction.Rollback();
        // log error
    }
}

Aber ich BeginTransaction*Async*persönlich habe es noch nie benutzt.


Beantwortet von –
ornic


Antwort geprüft von –
Mary Flores (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like