392 Stimmen

Wie kann ich mehrere Zeilen in Entity Framework löschen (ohne foreach)

Ich lösche mehrere Elemente aus einer Tabelle mit Entity Framework. Es gibt keinen Fremdschlüssel / übergeordnetes Objekt, so dass ich dies nicht mit OnDeleteCascade behandeln kann.

Im Moment mache ich das:

var widgets = context.Widgets
    .Where(w => w.WidgetId == widgetId);

foreach (Widget widget in widgets)
{
    context.Widgets.DeleteObject(widget);
}
context.SaveChanges();

Es funktioniert, aber das foreach stört mich. Ich verwende EF4, aber ich möchte kein SQL ausführen. Ich möchte nur sicherstellen, dass ich nichts verpasse - das ist so gut wie es geht, richtig? Ich kann es mit einer Erweiterungsmethode oder einem Helfer abstrahieren, aber irgendwo werden wir immer noch ein foreach ausführen, richtig?

4voto

UUHHIVS Punkte 1139

Hierfür können Sie Erweiterungsbibliotheken wie EntityFramework.Extended oder Z.EntityFramework.Plus.EF6 verwenden, die für EF 5, 6 oder Core verfügbar sind. Diese Bibliotheken sind sehr leistungsfähig, wenn Sie löschen oder aktualisieren müssen, und sie verwenden LINQ. Beispiel für das Löschen ( Quelle plus ):

ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) .Delete();

oder ( Quelle erweitert )

context.Users.Where(u => u.FirstName == "firstname") .Delete();

Diese verwenden native SQL-Anweisungen, so dass die Leistung hervorragend ist.

4voto

Amit Pawar Punkte 131

Für EF 4.1,

var objectContext = (myEntities as IObjectContextAdapter).ObjectContext;
objectContext.ExecuteStoreCommand("delete from [myTable];");

3voto

Amir Punkte 682

Wenn Sie alle Zeilen einer Tabelle löschen wollen, können Sie den Sql-Befehl

using (var context = new DataDb())
{
     context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
}

TRUNCATE TABLE (Transact-SQL) Entfernt alle Zeilen aus einer Tabelle, ohne die einzelnen Zeilenlöschungen zu protokollieren. TRUNCATE TABLE ähnelt der DELETE-Anweisung ohne WHERE-Klausel; allerdings ist TRUNCATE TABLE schneller und verbraucht weniger System- und Transaktionsprotokollressourcen.

2voto

Abhishek Sharma Punkte 279

Sie können Sql-Abfragen direkt wie folgt ausführen:

    private int DeleteData()
{
    using (var ctx = new MyEntities(this.ConnectionString))
    {
        if (ctx != null)
        {

            //Delete command
            return ctx.ExecuteStoreCommand("DELETE FROM ALARM WHERE AlarmID > 100");

        }
    }
    return 0;
}

Für select können wir verwenden

using (var context = new MyContext()) 
{ 
    var blogs = context.MyTable.SqlQuery("SELECT * FROM dbo.MyTable").ToList(); 
}

2voto

UUHHIVS ist eine sehr elegante und schnelle Methode für das Stapellöschen, aber sie muss mit Vorsicht verwendet werden:

  • Automatische Generierung von Transaktionen: Ihre Abfragen werden von einer Transaktion erfasst
  • Unabhängigkeit vom Datenbankkontext: Seine Ausführung hat nichts mit der context.SaveChanges()

Diese Probleme können umgangen werden, indem man die Kontrolle über die Transaktion übernimmt. Der folgende Code veranschaulicht, wie das Löschen und Einfügen von Stapeln auf transaktionale Weise erfolgt:

var repo = DataAccess.EntityRepository;
var existingData = repo.All.Where(x => x.ParentId == parentId);  

TransactionScope scope = null;
try
{
    // this starts the outer transaction 
    using (scope = new TransactionScope(TransactionScopeOption.Required))
    {
        // this starts and commits an inner transaction
        existingData.Delete();

        // var toInsert = ... 

        // this relies on EntityFramework.BulkInsert library
        repo.BulkInsert(toInsert);

        // any other context changes can be performed

        // this starts and commit an inner transaction
        DataAccess.SaveChanges();

        // this commit the outer transaction
        scope.Complete();
    }
}
catch (Exception exc)
{
    // this also rollbacks any pending transactions
    scope?.Dispose();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X