代码之家  ›  专栏  ›  技术社区  ›  Andreas Grech

C·LINQ:你能合并DataContexts吗?

  •  2
  • Andreas Grech  · 技术社区  · 16 年前

    假设我有一个数据库,这个数据库有一组对所有客户机通用的表和一些特定于某些客户机的表。

    现在我想的是创建一个 DataContext 它只包括对所有客户机通用的表,然后创建单独的 数据上下文 只包含特定于客户端的表的。


    有办法“合并”吗 数据上下文 所以它变成了一个上下文? 所以对于客户机a,我需要一个datacontext,它既包括通用表,也包括特定客户机的表(从两个不同的 数据上下文 S)?


    [更新]

    我想我能做的,是从半人半阶级的阶级,而不是让我的继承人继承。 数据上下文 我让它继承自 MyDataContext ;这样,桌子 MyDataContext 另一个数据上下文将在一个 数据上下文 班级。

    你觉得这种方法怎么样?当然,有了这样的东西,你只能同时合并两个数据上下文…

    4 回复  |  直到 16 年前
        1
  •  2
  •   Vasu Balakrishnan    16 年前

    我会用正面图案。创建一个facade上下文,它将从用户抽象底层数据上下文。如果需要,可以从默认datacontext继承并重写方法。在重写中,您可以将其传递给适当的datacontext。

        2
  •  1
  •   David Yancey    16 年前

    我不知道该怎么做。

    您可能希望看到的是使用设计模式来实现这一目标。通过使用模式以及一个存储库模式,您就可以定义所有客户机资源库将继承的基本接口存储库。然后,对于每个客户机存储库,您可以根据它们的特定需求扩展它。

        3
  •  0
  •   Neil T.    15 年前

    我不知道你是否已经知道了,但是合并数据上下文不是个好主意。其中很大一部分原因与datacontext对象中内置的更改跟踪有关。如果您能够将实体对象分开,以便更改一次只影响一个datacontext而不重叠,那么您就可以让它工作,但对于这么少的回报来说,这似乎太麻烦了。

    您可以实现一个存储库模式,但同样,一个datacontext无法识别用另一个datacontext创建的对象时仍然存在问题。我当前工作的项目仅使用一个datacontext。数据库现在有大约75个表…我有一对一、一对多和多对多的关系,我还没有遇到严重的性能或实现问题,只使用一个数据上下文。使用facade模式可能可以工作,但同样,您需要扪心自问,维护多个不能直接交互的数据上下文是否值得。

    例如,假设您有一个customer表和orders表。customer表位于一个datacontext中,orders表位于另一个datacontext中。关系是一个客户对零到多个订单。因为在单独的DATACONTEX中有它们,所以我不相信您可以直接引用查询中的子实体对象。因此,为了获得特定客户的订单,您可能不得不这样做:

    var orders = DC2.Orders.Where(a => a.Customer_ID == (DC1.Customers.Where(a => a.Customer_ID == 7).Customer_ID);
    

    而不是这个:

    var orders = DC.Customers.Where(a => a.Customer_ID == 7).Select(a => a.Orders);
    
        4
  •  0
  •   Raydioshead    12 年前

    我们通过在datacontext中使用继承来实现这一点,我们使用ef5、code-first和mvc4来实现前端web项目。

    我们有一个公共数据上下文来封装数据库中的所有公共表

    public partial class CommonDataContext : DbContext
    {
        //Your code
    }
    

    以及使用自己的表和公共表的多个专用数据上下文

    public partial class Application1Context : CommonDataContext
    {
        //Your code
    }
    

    这些数据上下文中的每一个都位于同一解决方案中的单独项目中。 希望能帮上忙。