Prowadzę ze sobą mentalną debatę za każdym razem, gdy zaczynam pracę nad nowym projektem i projektuję swoje POCO. Widziałem wiele samouczków / przykładów kodu, które wydają się faworyzować skojarzenia kluczy obcych :
Skojarzenie klucza obcego
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
W przeciwieństwie do niezależnych stowarzyszeń :
Niezależne stowarzyszenie
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
W przeszłości pracowałem z NHibernate i korzystałem z niezależnych skojarzeń, które nie tylko sprawiają wrażenie bardziej OO, ale także (z leniwym ładowaniem) mają tę zaletę, że dają mi dostęp do całego obiektu klienta, zamiast tylko jego identyfikatora. Pozwala mi to na przykład pobrać instancję Order, a następnie zrobić to Order.Customer.FirstName
bez konieczności jawnego łączenia, co jest niezwykle wygodne.
Podsumowując, moje pytania to:
- Czy są jakieś istotne wady korzystania z niezależnych stowarzyszeń? i...
- Jeśli ich nie ma, jaki byłby w ogóle powód używania skojarzeń kluczy obcych?
źródło
Użyj obu. I spraw, aby twoje encje były wirtualne, aby umożliwić leniwe ładowanie. Lubię to:
Oszczędza to niepotrzebne wyszukiwania bazy danych, pozwala na leniwe ładowanie i pozwala łatwo zobaczyć / ustawić identyfikator, jeśli wiesz, jaki ma być. Zauważ, że posiadanie obu nie zmienia w żaden sposób struktury tabeli.
źródło
Niezależne skojarzenie nie działa dobrze z
AddOrUpdate
tym, co jest zwykle używane wSeed
metodzie. Gdy odniesienie jest istniejącym elementem, zostanie ponownie wstawione.W rezultacie istniejący klient zostanie ponownie wstawiony, a nowy (ponownie wstawiony) klient zostanie powiązany z nowym zamówieniem.
Chyba że użyjemy skojarzenia klucza obcego i przypiszemy identyfikator.
Mamy oczekiwane zachowanie, dotychczasowy klient zostanie powiązany z nowym zamówieniem.
źródło
var order = new Order { Id = 1, Customer = db.Customers.Find(1) };
Lub możesz użyć metody Select, aby załadować klienta z kontekstu db. Działa to z niezależnym stowarzyszeniem.Preferuję podejście obiektowe, aby uniknąć niepotrzebnych wyszukiwań. Obiekty właściwości można równie łatwo wypełnić, wywołując metodę fabryki w celu zbudowania całej jednostki (przy użyciu prostego kodu wywołania zwrotnego dla jednostek zagnieżdżonych). Nie ma żadnych wad, które widzę poza zużyciem pamięci (ale buforowałbyś swoje obiekty, prawda?). Zatem wszystko, co robisz, to zastępowanie stosu stosem i zwiększanie wydajności wynikające z nieprzeprowadzania wyszukiwań. Mam nadzieję, że to ma sens.
źródło