Jedes Mal, wenn ich an einem neuen Projekt arbeite und meine POCOs entwerfe, habe ich eine mentale Debatte mit mir. Ich habe viele Tutorials / Codebeispiele gesehen, die Fremdschlüsselassoziationen zu bevorzugen scheinen :
Fremdschlüsselzuordnung
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
Im Gegensatz zu unabhängigen Vereinen :
Unabhängiger Verein
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
Ich habe in der Vergangenheit mit NHibernate gearbeitet und unabhängige Assoziationen verwendet, die sich nicht nur mehr OO anfühlen, sondern auch (bei verzögertem Laden) den Vorteil haben, dass ich auf das gesamte Kundenobjekt anstatt nur auf dessen ID zugreifen kann. Auf diese Weise kann ich beispielsweise eine Order-Instanz abrufen und dann Order.Customer.FirstName
ohne expliziten Join auskommen, was äußerst praktisch ist.
Um es noch einmal zusammenzufassen, meine Fragen sind:
- Gibt es signifikante Nachteile bei der Verwendung unabhängiger Verbände? und...
- Wenn es keine gibt, was wäre der Grund für die Verwendung von Fremdschlüsselzuordnungen?
quelle
Verwende beide. Machen Sie Ihre Entitätsreferenzen virtuell, um ein verzögertes Laden zu ermöglichen. So was:
Dies erspart unnötige DB-Suchvorgänge, ermöglicht ein verzögertes Laden und ermöglicht das einfache Anzeigen / Festlegen der ID, wenn Sie wissen, wie sie aussehen soll. Beachten Sie, dass beides Ihre Tabellenstruktur in keiner Weise ändert.
quelle
Unabhängige Assoziationen funktionieren nicht gut damit
AddOrUpdate
, was normalerweise inSeed
Methoden verwendet wird. Wenn die Referenz ein vorhandenes Element ist, wird sie erneut eingefügt.Das Ergebnis ist, dass der bestehende Kunde erneut eingefügt wird und der neue (neu eingefügte) Kunde einer neuen Bestellung zugeordnet wird.
Es sei denn, wir verwenden die Fremdschlüsselzuordnung und weisen die ID zu.
Wir haben das erwartete Verhalten, bestehende Kunden werden mit neuen Bestellungen verbunden.
quelle
var order = new Order { Id = 1, Customer = db.Customers.Find(1) };
Oder Sie können die Select-Methode verwenden, um den Kunden aus dem Datenbankkontext zu laden. Dies funktioniert mit unabhängiger Vereinigung.Ich bevorzuge den Objektansatz, um unnötige Suchvorgänge zu vermeiden. Die Eigenschaftsobjekte können genauso einfach ausgefüllt werden, wenn Sie Ihre Factory-Methode aufrufen, um die gesamte Entität zu erstellen (unter Verwendung eines einfachen Rückrufcodes für verschachtelte Entitäten). Es gibt keine Nachteile, die ich sehen kann, außer der Speichernutzung (aber Sie würden Ihre Objekte zwischenspeichern, oder?). Alles, was Sie tun, ist, den Heap durch den Stack zu ersetzen und einen Leistungsgewinn zu erzielen, wenn Sie keine Suchvorgänge durchführen. Ich hoffe das macht Sinn.
quelle