2015-07-03 22 views
0

我遇到了重大問題,我應該如何模擬這種關係層次結構,並希望有人能夠提出建議,並指出我需要做的任何特殊配置FluentAPI。EF6 - 爲客戶管理系統建模複雜的層次結構

基本上,我正在創建一個客戶管理系統。我希望基礎對象是一個「Person」,它將保存一個id,名稱,聯繫信息等。

接下來,我想要有一個「Customer」的概念,它是系統中的Person還有一些其他數據,比如一個CustomerNumber字符串在上面。

然後,我希望每個人都有一個其他人是「親屬/朋友」的集合。它還需要指定關係的類型(兄弟,父親等)。

因此,基本上,它歸結爲擁有一個龐大的人員數據庫的目標 - 任何人都可能成爲客戶,也可能不是客戶,並且任何人都可以設置爲任何其他人員/客戶的親友整個系統。一個人可以有無限數量的親戚/朋友,並且可以是任何數量的其他人的親戚/朋友(或根本沒有)。

我希望我已經解釋得很好。我以幾種不同的方式(從使用繼承,直接爲外鍵建模連接表)對此進行了建模,到目前爲止,在生成模型時沒有任何結果與正確的數據庫結構有關。

+0

那麼,你似乎有什麼是正確的概念。爲什麼不分享它? –

回答

2

我會建議數據庫結構是這樣的:

ERD

客戶/聯繫人:

我沒有處理過的Customer作爲Person一個特例,因爲分崩離析您的第一次客戶是企業或其他類型的組織。

如果您將Customer作爲實體類型進行單獨處理並允許其包含一個或多個人,那麼您可以將個人作爲個人(包括他們所有的關係)一次又一次地跟蹤其優勢 - 即使他們是您的客戶,也可以共同作爲企業或其他組織的一部分。

對於很多客戶來說,在Commercial_Relationship中只有一條記錄,這很好,但該模型提供了靈活性來追蹤每個人一次,即使他們在不同的環境中處理您的商業情況。

例如,我在斯臺普斯購買筆,因爲我有時在家需要一支筆。不過,我有時也會在斯臺普斯購買筆,因爲我在我的辦公室需要一支筆。我的會計師使我使用不同的信用卡來支付這些個人和業務費用,以便使兩者明顯不同。不過,我很高興我沒有從斯臺普斯那裏得到兩套垃圾郵件,因爲我在兩種不同的環境下向他們購買。

人際關係:

這根本就是兩個Person記錄之間的許多一對多的關係。所有需要的是一個交集實體類型。但是請注意,命名這種關係往往是有方向性的。在某些情況下,只需要一個名詞,而不管你穿過關係的方向。鮑勃是比利的朋友和比利是鮑勃的朋友。然而,Bob是Sally的父親,但Sally是Bob的女兒(或兒童等)。因此,Personal_Relationship需要兩個說明,具體取決於您穿過關係的方向。

+0

我打算建議Customer是Person的一個子類。但你的警告是一個很好的點。 –

+0

這些都是非常好的一點,我認爲這非常接近我所需要的。唯一我仍然不確定的事情是,我將如何設置(在EF codefirst fluentapi中),以便我可以在每個Person上具有導航屬性以查看PersonalRelationships。 – jdraper3

+0

@ jdraper3 - 您可以將'Commercial_Relationship'作爲常規的多對多交叉點。首先請參閱:https://msdn.microsoft.com/en-us/data/jj591620.aspx#ManyToMany。對於「Personal_Relationship」,你不能使用常規的EF多對多。您需要明確建模交叉點併爲每個方向添加描述。請參閱:http://stackoverflow.com/questions/7050404/create-code-first-many-to-many-with-additional-fields-in-association-table。 –