2014-03-28 48 views
1

與實體框架6的工作,我有一個Person類多關係......實體框架許多對同一實體類型,但具有不同的關係類型

public class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Relationship> Relationships { get; set; } 
} 

和關係類

public class Relationship 
{ 
    public int ID { get; set; } 
    public RelationshipType DependencyType { get; set; } 

    [ForeignKey("Person")] 
    public int PersonID { get; set; } 
    public virtual Person Person { get; set; } 

    public virtual ICollection<Person> RelatedPersons { get; set; } 

} 

我想要表示的是,例如,我可能將兄弟姐妹作爲關係類型,將UnclesAndAunts作爲另一種關係類型,並保存這些類型的關係,而無需知道父母是誰,因爲他們可能不在數據庫中。

隨着代碼首先,這將產生的表模式...

CREATE TABLE [dbo].[Person](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[Name] [nvarchar](max) NULL, 
[Relationship_ID] [int] NULL) 

CREATE TABLE [dbo].[Relationship](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
[RelationshipType] [int] NOT NULL, 
[PersonID] [int] NOT NULL, 
[Person_ID] [int] NULL) 

PersonID is the main Person of this relationship. 
Person_ID is the Person to whom the main person is related to. 
I would see the Relationship table containing repeated PersonID data. 

的問題,這是因爲Relationship_ID的Person表中,這是說, Person表將具有重複的數據,而我希望關係表具有重複的數據,例如

Relationship... 

ID RelationshipType PersonID Person_ID 
--------------------------------------------- 
1 Sibling   1   2 
2 Sibling   1   3 
3 UnclesAndAunts 1   4 

有人能告訴我應該如何用Model Classes來表示這個,我假設有一些屬性或其他需要包含的屬性。

感謝

回答

2

Relationship_IDRelationship.RelatedPersons收集莖。我認爲這是不正確的有收集這裏,相反,它應該是因爲一個Relationship實體單參考RelatedPerson(單數)精確地描述了人與人之間的關係,而不是一個人,其他的集合之間人。所以,我建議改變模型是這樣的:

public class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    [InverseProperty("Person")] 
    public virtual ICollection<Relationship> Relationships { get; set; } 
} 

public class Relationship 
{ 
    public int ID { get; set; } 
    public RelationshipType DependencyType { get; set; } 

    [ForeignKey("Person")] 
    public int PersonID { get; set; } 
    public virtual Person Person { get; set; } 

    [ForeignKey("RelatedPerson")] 
    public int RelatedPersonID { get; set; } 
    public virtual Person RelatedPerson { get; set; } 
} 

[InverseProperty]屬性是非常重要的在這裏告訴EF這Relationship.PersonPerson.Relationships逆導航屬性。如果沒有該屬性,您將在Relationship表中獲得三個外鍵,該表指向Person表。

您可能還需要禁用其中一個關係的級聯刪除,以避免有關禁止從PersonRelationship的多個級聯刪除路徑的例外情況。它可以用流利的API來完成:

modelBuilder.Entity<Relationship>() 
    .HasRequired(r => r.RelatedPerson) 
    .WithMany() 
    .HasForeignKey(r => r.RelatedPersonID) 
    .WillCascadeOnDelete(false); 

一旦你有,你可以加用流利的API第二關係,以及這將允許您從模型中移除所有屬性,因爲它們是那麼多餘的:

modelBuilder.Entity<Relationship>() 
    .HasRequired(r => r.Person) 
    .WithMany(p => p.Relationships) 
    .HasForeignKey(r => r.PersonID); 
+0

絕對沒錯,我只是把關係弄錯了,最後得到了一個解決方案,與你所建議的一致。唯一的區別是,爲了完整性,我添加了第二個ICollection虛擬屬性,其InverseProperty爲「RelatedPerson」。另外,我沒有去Fluent API路由,我只是將RelatedId和RelatedPersonId設置爲空(int?),從而解決了級聯問題。謝謝。 – Hoots

相關問題