wake-up-neo.com

Richtiger Weg, um Datensätze in LINQ to Entities zu löschen

Ich habe nur eine sehr einfache Situation, in der ich alles löschen muss, indem ich Linq2Entities verwende. Ich habe versucht, etwas zu recherchieren und finde immer noch nicht den richtigen Weg, um das zu tun.

Hier ist mein einfacher Code:

[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteEmployee(Employee z)
{
    using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
                 where  y.EmployeeId == z.EmployeeId
                 select y).FirstOrDefault();
         ctx.DeleteObject(x);
         ctx.SaveChanges();
    }
 }

[DataObjectMethod(DataObjectMethodType.Select)]
public List<Employee> GetAllEmployee()
{
    using (var ctx = new MyEntity())
    {
        var x = from y in ctx.Employees
                select y;
        return x.ToList();
    }
}

Ich kann einen bestimmten Datensatz löschen, wenn ich zum Beispiel y.EmployeeName == "Harold Javier" der Delete-Methode oben zuweise, aber wenn ich y.EmployeeId == z.EmployeeId dem obigen Code zuweise Das Löschen funktioniert nicht. (Hinweis: EmployeeId ist der Primärschlüssel der Employee-Tabelle.)

11
Harold Javier

Ich beschloss, meine eigene Frage zu beantworten.

Meine Löschfunktion funktionierte, wenn ich Folgendes tat:

using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
             orderby  y.EmployeeId descending
             select y).FirstOrDefault();
        ctx.Employees.DeleteObject(x);
        ctx.SaveChanges();
    }

Ich weiß, dass es einen besseren Ansatz geben könnte als dies, aber es funktioniert für mich mittlerweile.

4
Harold Javier

Ich denke, das ist eine bessere Option zum Löschen

using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
             orderby  y.EmployeeId descending
             select y).FirstOrDefault();
        ctx.Employees.Remove(x);
        ctx.SaveChanges();
    }

an meiner Seite funktioniert DeleteObject nicht, also verwende ich Remove

12
Sanket Gandhi

sie müssen zunächst überprüfen, ob ein Datensatz vorhanden ist, bevor Sie ihn tatsächlich löschen.

[DataObjectMethod(DataObjectMethodType.Delete)]

    public void DeleteEmployee(Employee z)
    {
        using (var ctx = new MyEntity())
        {
            var x = (from y in ctx.Employees
                     where  y.EmployeeId == z.EmployeeId
                     select y).FirstOrDefault();
             if(x!=null)
             {
             ctx.Employees.DeleteObject(x);
             ctx.SaveChanges();
             }
        }
     }

Überprüfen Sie immer auf Nullen, bevor Sie etwas löschen. Weil ein Benutzer die ID (bei Abfragen) ändern und verschiedene Kombinationen ausprobieren kann.

5
DotNet Dreamer

Die obige Antwort ist möglicherweise veraltet ... Die DeleteObject-Methode scheint in der aktuellen Version von ENtity Framework nicht zu existieren. Ich musste die Remove-Methode verwenden. 

var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);
3
Scooter

@Harold, ich weiß, dass dieser Beitrag ziemlich alt ist, aber ich denke, es ist wichtig, Ihre ursprüngliche Frage und Antwort zu beantworten. Ihre Lösung hat möglicherweise in Ihrer Situation funktioniert, es gibt jedoch einige Probleme.

Zunächst hat Ihr ursprünglicher Code den zu löschenden Datensatz basierend auf einem übergebenen Parameter ausgewählt. Ihre Lösung löscht den Datensatz mit der größten EmployeeId. Das ist vielleicht das, was Sie wünschen, aber nicht wahrscheinlich. Das zweite Problem ist, dass zwei Datenbankzugriffe erforderlich sind, um das Löschen durchzuführen. Die erste besteht darin, die Entität zum Löschen der zweiten zu veranlassen, um das Löschen tatsächlich durchzuführen.

Das folgende Code-Snippet macht das Lesen überflüssig und löscht den Mitarbeiter "z". Dies sollte das gewünschte Ergebnis liefern und viel besser abschneiden.

public void DeleteEmployeeId(Employee z)
{
    using (var ctx = new MyEntityContext())  
    {  
        var x = new Employee{ EmployeeId = z.EmployeeId };
        ctx.Entry(x).State = EntityState.Deleted;  
        ctx.SaveChanges();  
    }
}
2
Jim Reineri

Folgendes hat für mich funktioniert:

MyList.RemoveAll(x => x.MyField == 0);
1
Jackson Rosado

Dies liegt wahrscheinlich daran, dass der Kontext bei jeder Anforderung unterschiedlich ist (var ctx = new MyEntity ()). Versuchen Sie es damit

public static class ObjectContextPerHttpRequest
{
    public static TestCasesModelContainer Context
    {
        get
        {
            string objectContextKey = HttpContext.Current.GetHashCode().ToString("ObjectContextPerHttpRequest");

            if (!HttpContext.Current.Items.Contains(objectContextKey))
            {
                HttpContext.Current.Items.Add(objectContextKey, new TestCasesModelContainer());
            }

            return HttpContext.Current.Items[objectContextKey] as TestCasesModelContainer;
        }
    }
}

Und löschen ist wie 

public static void Delete(Testcase tc)
{
    var db = ObjectContextPerHttpRequest.Context;

    db.DeleteObject((from p in db.TestcaseSet
                     where p.Id == tc.Id
                     select p).Single());
    db.SaveChanges();
}
1