2012-03-05 110 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中有一个局限性,你不能对来自不同数据上下文的对象进行查询。