2011-08-11 94 views
5

我想這個類:一零/一的關係(代碼優先)

public class Person 
{ 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    public int SpouseID { get; set; } 
    public virtual Person Spouse { get; set; } 
} 

的關係是: 一人一個或零配偶/ 夫妻一方有需要的人

是否可以在Fluent API中構建此模型?

謝謝。

回答

6

不幸的是,不可能做出真正的自引用一對一關係,因爲目前EF不支持唯一鍵。爲了使這個真正的自我參照一對一SpouseID必須被標記爲唯一。 EF僅允許在主鍵上一對一(主鍵在依賴實體中也必須是主體實體的外鍵),這意味着自引用一對一關係將以PersonID <-> PersonID結束=單個表中具有相同PersonID的兩個實體。這是不可能的,因爲PersonID是主鍵,它必須是唯一的。

您可以將其作爲一個一對多和只露出一個導航屬性,你知道:

modelBuilder.Entity<Person>() 
      .HasOptional(p => p.Spouse) 
      .WithMany() 
      .HasForeingKey(s => s.SpouseID); 

強制執行數據庫中的一個一對一的關係,您將添加custom database initializer和手動創建獨特索引SpouseID列。

問題是,它只是單向導航,所以你可以得到人的配偶,但從Spouse你不能回到丈夫。

+0

感謝您的幫助Ladislav – Joao

1

這個答案是建議,而不是一個確切的答案。

在現實世界的情況下,這是不正確的設計,首先每個配偶都有配偶以及引用同一個人,例如,配偶的配偶配偶是Person本身。我們在我們的應用程序中將此模型設置爲Persons和PeronRelations,PersonRelations具有FromPersonID,ToPersonID和Type屬性。類型指定 「丈夫< - >妻子」, 「老婆< - >丈夫」, 「父親< - >兒子」, 「兒子< - >父」 等

public class Person{ 
    public int PersonID {get;set;} 
    ... 
    public ICollection<PersonRelations> FromRelations {get;set;} 
    public ICollection<PersonRelations> ToRelations {get;set;} 

} 

public class PersonRelations{ 

    .. 
    public int FromPersonID {get;set;} 
    public int ToPersonID {get;set;} 

    public RelationType Type {get;set;} 
    public Person FromPerson {get;set;} 
    public Person ToPersion {get;set;} 

    // useful for Employment and Marriage 
    // durations 
    public DateTime? Start {get;set;} 
    public DateTime? End {get;set;} 
} 

public enum RelationType{ 
    Husband_Wife, 
    Wife_Husband, 
    Father_Son, 
    Son_Father, 
    Friend_Friend, 
    Employee_Employer, 
    Employer_Employee 
} 

這給你優勢,因爲你可以存儲更多關於每個關係的信息並在兩個方向上導航它們以及許多查詢。

每個關係都有相應的對立關係。你將不得不編寫額外的邏輯來保持正確的反向關係,以便它正常工作。

這在Entity Framework中很容易實現,因爲它是簡單的一對多關係。