我正在處理幾個共享相同「基礎」的項目。他們都使用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上創建基礎實體並將其擴展到多個項目。
感謝您花時間閱讀所有這些內容。