2016-06-04 9 views
0

Während EF Lernen passiert Link Entity Framework Databinding with WinForms, müssen zwei kleine Präzisierungen in Bezug auf den Code unten, um zu sehenWarum Entity Framework löscht die Entität nicht, wenn ich sie aus der Navigationseigenschaftssammlung entferne?

// Currently, the Entity Framework doesn’t mark the entities 
// that are removed from a navigation property (in our example the Products) 
// as deleted in the context. 
// The following code uses LINQ to Objects against the Local collection 
// to find all products and marks any that do not have 
// a Category reference as deleted. 
// The ToList call is required because otherwise 
// the collection will be modified 
// by the Remove call while it is being enumerated. 
// In most other situations you can do LINQ to Objects directly 
// against the Local property without using ToList first. 
foreach (var product in _context.Products.Local.ToList()) 
{ 
    if (product.Category == null) 
    { 
     _context.Products.Remove(product); 
    } 
} 

// Save the changes to the database. 
this._context.SaveChanges(); 

1, wenn wir ein Kind Element löschen, das Produkt (nav Eigentum der Kategorie) aus einer Kategorie ist, das Produkt. Kategorie wird null. Wir löschen das Produkt (nav der Kategorie) und wie die Entity-Frame-Arbeit die Kategorie als null in lokalen Kollektionsprodukten markiert.

2 Gibt es andere Optionen zum Löschen der nav-Eigenschaft als das Aufzählen der gesamten Sammlung? Wenn Nein können wir nur das Element unter dieser bestimmten Kategorie durchlaufen, um Leistungsprobleme zu vermeiden, wie können wir die "foreach (var product in _context.Products.Local.ToList()) ", um nur das Element in dieser Kategorie zu durchlaufen.

+0

Es ist mir nicht klar, was Ihr Problem ist. 1. * product.category wird null * Na und? Sie löschen es trotzdem. 2. * diese bestimmte Kategorie * Welche Kategorie? Sie löschen Produkte * ohne * eine Kategorie. –

+0

Der Code dient einem wichtigen Ziel: Erkennen, welche Produkte gelöscht werden sollen. Um herauszufinden, warum ein solcher Code geschrieben wurde, lesen Sie die Antwort unten. –

Antwort

1

Der Code dient einem wichtigen Ziel: Ermitteln, welche Produkte gelöscht werden sollen. Um herauszufinden, warum ein solcher Code geschrieben wurde, lesen Sie die Antwort unten.

Was macht Entity Framework, wenn ich eine Entität aus der Navigationseigenschaftensammlung entferne?

Entity Framework markiert die Entitäten, die aus einer Navigationseigenschaftensammlung entfernt werden, nicht als im Kontext gelöscht. Es entfernt lediglich die Entität aus der Sammlung von Navigationseigenschaften und schneidet die Beziehung ab, indem die übergeordnete Navigationseigenschaft der Entität auf null gesetzt und die untergeordnete verwaiste Person erstellt wird.

Dies liegt daran, dass Sie die Entität gerade aus der Navigationseigenschaftssammlung entfernt haben und nicht aus Entitätsgruppen. Wenn Sie sie aus der Navigationseigenschaft entfernen, wird nur die Beziehung abgeschnitten.

Zum Beispiel, wenn Sie eine N-N Beziehung zwischen Kategorien und Produkten haben, wobei jede Kategorie 0 oder N Produkte haben kann und jedes Produkt zu 0 oder N Kategorien gehören kann. Wenn Sie dann ein Produkt aus der Navigationseigenschaftssammlung einer Kategorie entfernen, möchten Sie das Produkt nicht löschen. Sie möchten nur das Produkt aus dieser Kategorie entfernen, aber das Produkt und seine Beziehungen, deren andere Kategorien unberührt bleiben sollen.

Wie kann ich verwaiste Entitäten finden?

Verwaiste untergeordnete Entitäten haben übergeordnete Eigenschaft mit Nullwert. Sie sind immer noch im lokalen Speicher des Entitätssatzes von untergeordneten Entitäten vorhanden. So können Sie sie finden und sie zum Löschen markieren. Im Artikel Beispiel in einer 1-N-Beziehung zwischen Kategorien und Produkten gehört jedes Produkt zu einer Kategorie und das Entfernen von Produkten aus einer Sammlung bedeutet das Löschen, also in diesem Fall, wenn Sie ein Produkt aus der Kindersammlung entfernen einer Kategorie ist Ihr Ziel das Löschen des Produkts. Also sollten Sie in Local Speicher von Products einchecken und alle Produkte finden, die ihre Catergorynull ist und Thema zum Löschen markieren.

Ihre Fragen

  1. Wie oben erwähnt, EF setzt die Kategorie Eigenschaft eines Produkts auf null, wenn Sie das Produkt aus Produkten Sammlung der Kategorie entfernen. Auf diese Weise schneidet EF die Beziehung ab.

  2. Während die aktuelle Lösung in Ordnung ist, aber ja, gibt es auch andere Lösungen.Da Products die Eigenschaft Category vom Typ ObservableCollection<T> ist, können Sie sie unter CollectionChanged registrieren und das Löschen des Produkts entdecken, und Sie können das Produkt aus dem Kontext entfernen.
    Aber das Durchlaufen Products der aktuellen Kategorie ist nutzlos, weil das Produkt von dort entfernt wird.

Verwandte Themen