2016-06-14 51 views
15

我試圖閱讀關於複雜類型的msdn article。但它沒有解釋何時使用它。此外,網絡上還沒有關於複雜類型以及何時使用它們的全面解釋。什麼是實體框架中的複雜類型以及何時使用它?

+1

以下內容提供了更多詳細信息,但並未直接回答您的問題 - [EF Code First中的關聯:第2部分 - 複雜類型](http://weblogs.asp。net/manavi/associations-in-ef-4-1-code-first-part-2-complex-types) –

+0

謝謝我會研究它 –

回答

23

冗長的解釋是你鏈接的MSDN文章中...所以你基本上要一個簡單的解釋:

複雜類型是一組存在於自己的對象爲C#屬性,但被映射到在已經存在的表(包含它的實體的表)上的列,而不是具有它自己的表(這將需要一個鍵等)。

所以,想象一下你想在數據庫上此表:

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

但希望這種結構在C#實體:

class Order 
{ 
    long Id; 
    string Name; 

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

所以有Address將是一個複雜類型:那就不存在(數據庫上不會有Addresses表)......它只會作爲Orders表中的一組列存在。

如@HenkHolterman在評論所指出的,具有由具有其可被用作用於其它含實體的值(在我的示例的單個C#實體複雜類型的值,可以在一個Supplier實體具有Address例如,但它只會被映射爲Suppliers表中的一組列)。它使處理複雜類型的值變得很容易。

其缺點恰恰在於:如果發生在同一個Address(或任何其他類型的用戶)可以在不同的實體之間共享,您可能不得不在數據庫中多次重複複雜類型值。

您是否選擇使用複雜類型或獨立實體取決於您和您的設計。

+1

你對你的回答的評論沒有意義,看起來像@HenkHolterman已刪除他的評論 – Thomas

7

考慮這個ContactDetails類,例如:

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

默認情況下,EF將把ContactDetails作爲實體。這意味着,如果(舉例來說)你有一個PersonContactDetails類型的導航性能,EF將映射Person.ContactDetails關係到不同的表(因爲實體是具有一個身份的東西自己的,因此其他實體可能會提及它 - 並且這將需要關係術語中的不同表格)。

通過表示ContactDetails作爲複雜類型代替,EF將不再把它作爲一個需要關係的實體,而是將其映射到父(含)實體的相同的表(在我的例子Person),有效地使其成爲Value Object