创建核心模型并在不同的项目上进行扩展(Linq2SQL)

本文关键字:扩展 Linq2SQL 项目 模型 核心 创建 | 更新日期: 2023-09-27 18:27:02

我正在处理几个共享相同"基础"的项目。它们都使用Linq2SQL作为ORM,对于那些不熟悉L2S的人来说,1-n表的实现表示为EntitySet,1-1表示为属性(public OtherTable PropName{get;set;})。

我试图完成的是创建一个核心项目,其中包含将在几个项目中共享的模型。项目需要能够扩展这些模型并创建新的/重写属性(将保存在数据库中),方法也是如此。

所有项目都使用Repository模式来访问返回IQuerables或基元类型的数据库。DataContext是通过HttpRequest注入的。

我认为通过举例来解释会更容易。因此,我在BaseProject.Core中的User类将具有:(使用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; }
    }

我有一个新的数据上下文(我扩展了BaseProject.Core数据上下文),并重新拖动表以获得新用户类的新属性,我必须在dbml上设置要覆盖的所有属性,以确保我可以在基类方法和扩展类上都使用它们(我可以删除dbml上的每个属性,而不是标记覆盖,但我仍然不确定这是否是最好的方法)。

当然,我上面提出的想法是行不通的,甚至不能编译(重写方法上的不同类)。

其中一个解决方案是在核心项目中完全不关联它们,但这将使我无法使用entityset在基础项目上创建关系,因此我需要使用存储库而不是模型来查询数据库,但这会阻碍我在核心项目上使用以下内容:

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

所以我希望有人能给我一些想法或一个新的起点,告诉我如何在核心DLL上创建基本实体,并将其扩展到几个项目中。

谢谢你花时间阅读这一切。

创建核心模型并在不同的项目上进行扩展(Linq2SQL)

我认为使用Entity框架的代码优先方法会有更好的运气。

如果你不熟悉的话,这里有一篇很好的文章:http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

我们还没有对它进行足够的研究来说明是否有可能让Data对象以面向对象的方式相互扩展。我想说这是非常规的,尽管更好的方法可能是拥有一个数据访问(DAO)层,该层可以是OO,因为它可以相互扩展。需要考虑的一件事是,在L2SQL中有一个限制,即不能对来自不同数据上下文的对象进行查询。