2012-03-05 111 views
0

我正在處理幾個共享相同「基礎」的項目。他們都使用Linq2SQL作爲ORM,對於那些不熟悉L2S的人來說,1-n表實現表示爲EntitySet,1-1表示爲屬性(public OtherTable PropName {get; set;})。創建核心模型並擴展到不同的項目(Linq2SQL)

我想要完成的是創建一個包含將在多個項目中共享的模型的Core項目。這些項目需要能夠擴展這些模型並創建新的/覆蓋屬性(將保存在數據庫中),對於方法也是如此。

所有項目都使用Repository Pattern來訪問返回IQuerables或原始類型的數據庫。 DataContext由HttpRequest注入。

我認爲它會通過給出的例子更容易解釋。 所以我在BaseProject.Core中的用戶類將有: (使用L2S工具將所有道具添加爲虛擬是一種痛苦,如果我刪除表格並再次從數據庫中拖放,我將手動將它們全部更改再次)

public partial class User 
    { 
     public virtual Int32 Id { get; set; } 
     public virtual DateTime? BirthDate { get; set; } 
     public virtual EntitySet<BaseProject.Core.UserData> UserDatas; 
     } 
public partial class UserData 
    { 
     public virtual Int32 Id { get; set; } 
     public virtual Int32 ProcessId { get; set; } 
    } 

這將擴大它的項目之一(CurrentProject.Core):

public partial class User : BaseProject.Core.User 
    { 
     public override Int32 Id { get; set; } 
     public override DateTime? BirthDate { get; set; } 
     public override EntitySet<CurrentProject.Core.UserData> UserDatas; 
     public string Email { get; set; } 
    } 
public partial class UserData : BaseProject.Core.UserData 
    { 
     public override Int32 Id { get; set; } 
     public override Int32 ProcessId { get; set; } 
     public string MyNewProp { get; set; } 
    } 

我有一個新的DataContext(我延長了BaseProject.Core的datacontext),並重新對這些表進行封鎖以獲得新用戶類的新屬性,我必須這樣做t我所有的屬性都要在dbml上覆蓋,以確保我可以在基類方法和擴展類上使用它們(而不是標記覆蓋,我可以刪除dbml上的每個屬性,但我仍然不確定它是否是最好的方法來做到這一點)。

當然,我上面提出的想法是行不通的,甚至沒有編譯(重寫方法上的不同類)。

解決的辦法之一是在覈心項目不涉及他們所有,但會刪除我創建使用的EntitySet的基地項目關係的能力,所以我需要使用查詢數據庫存儲庫,而不是模型,但它會阻礙我使用的東西的核心項目就像能力:

dc.User.Where(x=>x.UserDatas.Count(y=>y.ProcessId == 1) == 0)

所以我希望有人可以給我一些想法或一個新的起點上如何在覈心DLL上創建基礎實體並將其擴展到多個項目。

感謝您花時間閱讀所有這些內容。

回答

0

我想你會有更好的運氣,使用實體框架的代碼第一種方法。

這裏有一個很好的文章,如果您不熟悉:http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

沒有帶與它的工作足夠說是否有可能具有延伸彼此的面向對象方法的數據對象。我會說這是非常規的,但更好的方法可能是建立一個數據訪問(DAO)層,它可以是面向對象的,因爲它可以相互擴展。有一點需要考慮的是,在L2SQL中有一個侷限性,你不能對來自不同數據上下文的對象進行查詢。