2013-06-19 36 views
0

我正在設計一個相當複雜的託管Web應用程序,需要支持多個彼此有效隔離的「團隊」。例如,表PeopleAreasReports等將有混在公司A,B,C由團隊填充的數據,並在上下行,並記錄在從公司A的用戶,他應該只看到過與公司A相關的數據。我的計劃是創建Team與(幾乎)所有其他類型之間的關係,並使用存儲庫訪問所有其他類型,並始終查詢TeamId與登錄人的TeamId相匹配的位置。這是EF Code First中TPC繼承的合法使用嗎?

所以,因爲我想有

[ForeignKey("Team")] 
public int TeamId { get; set; } 
public virtual Team Team { get; set; } 

上幾乎每一個類,我THI nking它可能是不錯的把那些在一個抽象類,繼承這些特性:

public abstract class OfTeam { 
    [ForeignKey("Team")] 
    public int TeamId { get; set; } 
    public virtual Team Team { get; set; } 
} 

public class Person : OfTeam { 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

但是,我知道這是不是真的是什麼繼承。所以我想知道

  1. 這是否會工作?
  2. 這是一個可怕的主意嗎?

回答

1

起初我被誤解了,儘管你是繼承團隊,這本來是一個壞主意。

如果你查詢db.OfTeam那麼它將聯合在一起的每一個表,從它繼承,這將非常演出。向下滾動以查看此處生成的SQL: http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx

否則,如果您直接將TeamId/Team放在所有這些類上,則實際的DB結構應該相同。

我個人不會這樣做,因爲它增加了很少的價值,並可能導致頭痛。

相反,你可以只對所有這些類的IOfTeam接口,如果有必要在一個通用的方式與他們交往的某些原因。

作爲一個方面說明我已經做了類似的事情,通常緩存TeamId地方交通方便,這樣我可以在任何地方CurrentIdentity.TeamId並把它傳遞到查詢。這允許像GetPeople這樣的存儲庫模式方法在返回IQueryable之前將該條件應用於該過濾器。

+0

我想到了一個界面。我可以這樣做。我並不完全關注緩存TeamId,而且我不確定CurrentIdentity是什麼,但這聽起來很有趣。關心一切嗎? – Andrew

+0

如果它是一個Web應用程序,您可以創建一個新的GenericPrincipal(yourCustomIdentity,null)並將其設置爲Context.User以及System.Threading.Thread.CurrentPrincipal。自定義標識可以使用您在Session中放置的值或從數據庫中檢索的值填充。這使您可以使用'(MyCustomIdentity)System.Threading.Thread.CurrentPrincipal.Identity'輕鬆訪問任何地方的身份 – AaronLS