2013-10-18 50 views
0

我試圖用CodeFirst生成我的數據庫指向。實體框架註釋與兩個表互相

我有兩個表StaffTeam,每個團隊中有一個團隊負責人是員工ID的外鍵,每個員工都與一個團隊相關聯。

public class Staff 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Username { get; set; } 
    public string PasswordHash { get; set; } 
    public string Salt { get; set; } 
    public string Token { get; set; } 
    public string Mobile { get; set; } 
    public string Email { get; set; } 
    public bool Admin { get; set; } 
    public bool Active { get; set; } 

    public int TeamID { get; set; } 

    [ForeignKey("TeamID")] 
    public Team Team { get; set; } 
} 

public class Team 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int TeamLeaderID { get; set; } 

    [ForeignKey("TeamLeaderID")] 
    public Staff TeamLeader { get; set; } 
} 

因爲每一個指向其他的我得到一個錯誤Unable to determine the principal end of an association between the types 'Team' and 'Staff'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.如何詮釋它以這樣一種方式,它理解爲什麼我這樣做。

+0

我建議改變球隊的TeamLeaderID porperty類型爲int? (可空int)。然後,您可以創建一個沒有TeamLeader的Team,並稍後設置TeamLeader。 – jannagy02

回答

1

想想這樣...首先是團隊還是團隊領導?如果你想創建一個團隊領導者,你不能這樣做,因爲你必須先指定一個團隊!但是如果你想創建一個團隊,你不能這樣做,因爲你必須根據你的外鍵約束來指定團隊領導者。

您將不得不以某種方式放鬆,或者讓團隊成員擁有可選的團隊領導,或者員工可以選擇屬於團隊。

通過更改外鍵ID中的一個爲可空類型做到這一點:

public int? TeamLeaderID { get; set; } 
+0

我仍然得到相同的錯誤,它似乎並不關心如果一個或兩個都是可空的,每個包含外鍵的事實都會拋出此錯誤:/ – ChaoticLoki

+0

嘗試調用SaveChanges兩次。一次爲每個實體。調用'更新,Database'所以生成數據庫結構 –

+0

錯誤?並使用'IsTeamLeader'標誌不佔'Staff'實體爲多個'Team's的成員那裏的工作人員可能是一個團隊在錯誤的類中的領導者,但不是另一個 – ChaoticLoki

0

你的代碼好像你正在嘗試包括業務規則執行/通過參照完整性負責。你的團隊 - >員工有一對多的關係。您只需爲TeamLeader添加一個布爾值。在進行數據庫寫入之前,您的邏輯應檢查是否已有TeamLeader。

public class Staff 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Username { get; set; } 
    public string PasswordHash { get; set; } 
    public string Salt { get; set; } 
    public string Token { get; set; } 
    public string Mobile { get; set; } 
    public string Email { get; set; } 
    public bool Admin { get; set; } 
    public bool Active { get; set; } 
    public IsTeamLeader { get; set; } 

} 

public class Team 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 

    //virtual keyword tells Code First to create the proper Foreign Key relationship 
    public virtual List<Staff> Members{ get; set; } 
} 

如果你有一個大的系統,與衆多開發者,你可以用流利的API來實現自己的目標和執行數據庫級團隊負責人的規則,從而防止無意中加入了一個脫節開發商第二領隊任何給定的球隊,但如果這是一個小的正常大小的項目,以小團隊,瞭解公司的基本知識/項目不是一個簡單的一對多的關係將完成使命,你可以依靠你的業務規則/邏輯來執行/保護數據庫數據,以便任何給定時間內任何給定團隊都有一名組長。考慮一下AddUpdateTeamMember類型的方法,每個人都會調用這個方法來強制團隊領導者的要求。存儲過程是另一種輕鬆解決此問題的好方法,如果您仍在考慮先採用模型並仍然先用代碼進行試驗。

也要考慮如果在項目的某個未來某個時間點某個團隊需要兩名團隊領導者,那麼數據庫可能會因爲「鎖定」而變得非常不方便以適應這種變化。

+0

時,你爲什麼會放在'IsTeamLeader'標誌在球隊實體時拋出 – Moho

+0

新增IsTeamLeader,我更新了我回答。 IsTeamLeader是Staff類的一部分,很顯然,一個Staff成員可以在一個團隊中成爲領導者,而IsTeamLeader成員則可以成爲另一個成員,而IsTeamLeader現在是Staff類的成員。 –