我正在处理几个共享相同“基础”的项目。他们都使用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上创建基础实体并将其扩展到多个项目。
感谢您花时间阅读所有这些内容。