2013-03-18 3 views
10

Ich habe nur eine sehr einfache Situation, wo alles, was ich brauche, ist Datensatz mit Linq2Entities zu löschen. Ich habe versucht, etwas zu recherchieren und kann immer noch nicht den richtigen Weg finden, es zu tun.Proper Weg zum Löschen von Datensatz in LINQ zu Entities

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 zuordnen == "Harold Javier" auf die Delete-Methode oben, aber wenn ich y zuweisen .EmployeeId == z.EmployeeId zu dem obigen Code funktioniert das Löschen nicht. (Hinweis: EmployeeId ist der Primärschlüssel der Employee-Tabelle)

+3

Was ist das Problem mit Ihrem Code? Irgendwelche Fehler?poste sie wenn ja. –

+0

Wir können den Code kompilieren und es scheint in Ordnung. Aber wenn wir es mit der ObjectDataSource (ASP.NET WebForm) verwenden, funktioniert die Schaltfläche Löschen nicht. –

+0

Versuchen Sie 'ctx.Employees.DeleteOnSubmit (x)' anstelle von 'ctx.DeleteObject (x)' – MarcinJuraszek

Antwort

3

Ich beschloss, meine eigene Frage zu beantworten.

Meine Löschfunktion funktionierte, als ich folgendes getan:

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ß, es könnte ein besserer Ansatz als dies sein, aber es funktioniert für mich für die mittlere Zeit.

5

Sie müssen zuerst ü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 Null, bevor Sie etwas löschen. Weil ein Benutzer die ID (bei Querystring) ändern und verschiedene Kombinationen ausprobieren kann.

+1

Danke, DonNet Dreamer. Aber die Suche nach Nullen löst unser Problem nicht. –

+0

Ich habe immer die Delete-Funktion als POST-Methode ('[HttpPost]') verwendet, nicht als get, was die Notwendigkeit beseitigt, die Querystring zu sichern. Null-Checks sind immer eine gute Übung, aber es ist nicht relevant für die Frage von OP und auch nicht der beste Weg, um Ihre Anwendung zu sichern. – Flater

1

Dies liegt wahrscheinlich daran, dass der Kontext bei jeder Anfrage anders ist (var ctx = new MyEntity()).

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; 
     } 
    } 
} 

mit diesen Versuchen 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(); 
} 
10

ich denke, die bessere Option ist

die Lösch-
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 DeleteObject nicht funktioniert so verwende ich Remove

1

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

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

@Harold, ich weiß, dieser Beitrag ist ziemlich alt, aber ich fühle mich ist es wichtig, Ihre ursprüngliche Frage und Antwort zu adressieren. Ihre Lösung hat vielleicht in Ihrer Situation funktioniert, aber es gibt ein paar Probleme.

Zuerst wählte der ursprüngliche Code den zu löschenden Datensatz anhand eines übergebenen Parameters aus. Ihre Lösung löscht den Datensatz mit der größten EmployeeId. Das könnte das sein, was du willst, aber nicht wahrscheinlich. Das zweite Problem ist, dass zwei Datenbankzugriffe erforderlich sind, um das Löschen zu erreichen. Die erste ist, dass die Entität die zweite löscht, um die Löschung tatsächlich durchzuführen.

Das folgende Code-Snippet wird die Notwendigkeit zum Lesen beseitigen und Mitarbeiter "z" löschen. Dies sollte das gewünschte Ergebnis liefern und viel besser funktionieren.

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(); 
    } 
} 
Verwandte Themen