2017-07-18 81 views
0

我有類似下面的類:實體框架代碼優先布爾外鍵

public sealed class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public string Id { get; private set; } 

    [Required] public string GroupId { get; set; } 

    [Required] public bool IsAdmin { get; set; } 
} 

而另:

public sealed class Group 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public string Id { get; private set; } 

    [ForeignKey("GroupId")] 
    public List<User> Users { get; set; } 
} 

User類的IsAdmin屬性表示是否該用戶是管理員。我想要做的是一個新的屬性添加到Group

public List<User> Admins { get; set; } 

這個新的列表將包含是他們組的管理員的所有用戶,這意味着他們的財產IsAdmin具有價值true。我已經使用自定義的getter此屬性,像這樣考慮:

public List<User> Admins 
{ 
    get 
    { 
     return this.Users.Where(user => user.IsAdmin); 
    } 
} 

不過,我想知道,如果實體框架可以照顧這對我來說。在我的腦海中,我可以想像它使用IsAdmin的方式類似於用於Users列表,其中具有User.GroupId = "foo"的每個用戶都包含在Group.Id = "foo"組的Users列表中。

所以我的問題是,我如何告訴EF使用用戶的IsAdmin屬性作爲外鍵填充Admins

+0

你應該堅持財產'清單管理員'。當你已經有了一些可行的東西時,爲什麼複雜化呢?簡單更好。 – JuanR

+0

由於管理員「是」用戶,您可以使用[繼承](http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx) –

+0

*我想知道如果實體框架可以爲我照顧這個*目前的答案沒有明確說明它,但是這個問題的答案是「否」。 –

回答

0

所以首先,在這種情況下使用術語「外鍵」是錯誤的。 IsAdmin不是外鍵,充其量是鑑別者。

其次,你可以使用[NotMapped]屬性這樣

[NotMapped]  
public List<User> Admins 
{ 
    get 
    { 
    return this.Users.Where(user => user.IsAdmin); 
    } 
} 

使EF忽略該屬性,並且不嘗試創建任何與它的關係,這樣,你會得到你想要的值在您訪問管理員時延遲加載。

最後,我認爲你的數據結構都是錯誤的。除非用戶只能成爲一個組的成員,或者作爲一個組中的管理員讓他們管理他們所屬的所有組,否則從域的角度來看,您的結構是有意義的,但從數據的角度來看仍然是錯誤的。 我建議你的做法是將Admin < - >用戶關係視爲多對多,並引入一個交叉對象GroupAdmins,該對象具有組的Id和用戶的Id。您可以讓EF自動創建交叉表,爲您提供更簡單的域模型,或者您可以手動執行此操作, See article for the former here

重新閱讀,你的問題,上述不適用,但是,我會留在這裏,以防有人遇到類似的情況發生在這個答案。