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.)
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.
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
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.
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);
@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();
}
}
Folgendes hat für mich funktioniert:
MyList.RemoveAll(x => x.MyField == 0);
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();
}