2016-06-14 5 views
15

Próbowałem przeczytać msdn article na typy złożone. Ale nie wyjaśnia, kiedy go używać. Również nie ma obszernego wyjaśnienia na temat typów złożonych i kiedy ich używać.Co to jest typ złożony w strukturze encji i kiedy go używać?

+1

Poniżej znajduje się więcej informacji, chociaż nie jest to odpowiedź bezpośrednio na twoje pytanie - [Związki z EF Code First: Part 2 - Complex Types] (http: //weblogs.asp.net/manavi/association-in-ef-4-1-code-first-part-2-complex-types) –

+0

dziękuję, zagłębię się w to –

Odpowiedz

23

Długie wyjaśnienie znajduje się w artykule MSDN ty połączonego ... więc w zasadzie chcą łatwe wyjaśnienie:

Złożony typ to zestaw właściwości, które istnieją we własnym obiekcie dla C#, ale są odwzorowywane kolumny na już istniejącej tabeli (ta, która zawiera ją), zamiast mieć własną tabelę (która wymagałaby klucza itp.).

Więc wyobraź sobie, że chcesz tej tabeli w bazie danych:

Orders 
---------- 
Id (bigint) 
Name (varchar) 
Street (varchar) 
Region (varchar) 
Country (varchar) 

Ale chcę tej struktury w C# podmioty:

class Order 
{ 
    long Id; 
    string Name; 

    struct Address 
    { 
    string Street; 
    string Region; 
    string Country; 
    } 
} 

Więc Address byłby złożony typ: nie istniałby samodzielnie (nie będzie tabeli Addresses) w bazie danych ... istniałaby tylko jako zestaw kolumn w tabeli Orders.

Jak zauważył @HenkHolterman w komentarzach, wartość konieczności złożonych typów jest posiadanie podmiot pojedynczy C#, który może być używany jako wartość dla innych podmiotów zawierających (w moim przykładzie, można mieć Address w jednostce Supplier na przykład, ale po prostu będzie mapowany jako zestaw kolumn w tabeli Suppliers). Ułatwia pracę z wartościami w złożonym typie.

Wadą jest właśnie to: być może będziesz musiał wielokrotnie powtarzać wartości typu złożonego w bazie danych, jeśli zdarzy się, że ten sam Address (lub jakikolwiek inny typ jakiego używasz) może być współużytkowany przez różne jednostki.

Niezależnie od tego, czy zdecydujesz się na pracę z typami złożonymi, czy osobnymi jednostkami, zależy to od Ciebie i Twojego projektu.

+1

Twoje komentarze na twoją odpowiedź nie mają sensu, wygląda jak @HenkHolterman usunięte jego komentarze – Thomas

7

Rozważmy ContactDetails klasę na przykład:

public class ContactDetails 
{ 
    public string HomePhone { get; set; } 
    public string MobilePhone { get; set; } 
    public string FaxNumber { get; set; } 
} 

Domyślnie EF potraktuje ContactDetails jako Jednostki. Oznacza to, że jeśli (przykładowo) masz do Person klasę z nawigacją własności ContactDetails typu EF będzie mapować relacji Person.ContactDetails do innej tabeli (bo Podmiot jest coś, co jest posiadanie tożsamość ITS własne, stąd inne podmioty mogą się do niego odwoływać - a to wymagałoby innej tabeli w kategoriach relacyjnych).

Przez oznaczający ContactDetails jako typu złożonego Zamiast EF nie będą traktować go jako podmiot, który wymaga związek i zamiast map go do tej samej tabeli rodzica (zawierający) jednostki (Person w moim przykładzie) skutecznie czyniąc z niego Value Object.