【问题标题】:LINQ to SQL multiple DataContext-sLINQ to SQL 多个 DataContext-s
【发布时间】:2010-09-19 00:35:07
【问题描述】:

我正在尝试找出有关如何组织 DataContexts 的最佳策略。我们工作的典型数据库有 50 到 100 个表,通常是第三范式,并且它们之间有很多关系。我认为我们有两个选择:

  1. 将所有表放在一个上下文中。这将确保我们所做的任何事情都将在数据库中以正确的顺序提交。问题是 LINQ 设计器会弄乱 50 多个表,我担心性能可能会受到影响。
  2. 根据表的逻辑分组创建多个数据上下文。问题在于,在某些地方,关系的一侧将在一个上下文中,而另一侧在另一个上下文中。我们必须手动处理以正确的顺序提交两个上下文。

有没有推荐的做法来处理这个问题?

更多细节:

我想在 LINQ to SQL 之上创建自己的实体和工作单元。实体将在 xml 模型文件中定义,其中还将指定到 LINQ 实体的映射。自定义工具将根据模型生成我的实体 (POCO)。客户端代码将仅与我的实体和我的工作单元交互;永远不要直接使用 DataContext 或 LINQ 实体。但是我不想复制 LINQ to SQL 提供的开箱即用的功能,所以我想使用底层的 LINQ DataContext。这意味着我不能在不同的数据上下文中拥有两个订单,因为不可能将我的 POCO 订单与它们都映射。

【问题讨论】:

    标签: sql linq linq-to-sql datacontext


    【解决方案1】:

    这是一个常见问题,这里已经彻底分析过了:http://craftycode.wordpress.com/2010/07/19/linq-to-sql-single-data-context-or-multiple/

    本质上,您应该为每个强连接的表组创建最多一个数据上下文,或者每个数据库一个数据上下文。

    【讨论】:

    • 这里的术语,这是否意味着只有一个 DataContext db = new DataContext(),发生在一个锁定对象的方法中(或者做一些事情来确保一次只有一个持久存在)?
    【解决方案2】:

    我为每个数据库使用一个数据上下文。

    平均表可以多达 100 个,但根据经验,我没有遇到任何性能问题。

    数据上下文位于一个单独的项目中,该项目已编译。从 BLL 引用的结果 dll

    【讨论】:

      【解决方案3】:

      LINQ-to-SQL 映射类似于类型化数据集,因为当您使用其中一个时,您正在处理一个包含数据的会话。您可以在几个不同的 DataContext 中拥有相同的表。毕竟,它们只是类;在您开始与数据库交互之前,它们没有任何意义,通过用现有数据填充它们或使用它们来创建新数据。

      因此,当您发送新目录时,您可能需要处理客户、地址、电话等表。然后,您就有了在创建订单时使用的 Invoice、Line Item、Product 等表。但是在后一组中,您可能还希望拥有 Customer。没关系。您应该注意一次只有一个会话处于活动状态,这样您就不会使用不一致的数据。只要您不以重叠的方式使用它们,您就不应该在各种 DataContexts 中重叠 entities

      就混乱而言,您可以将 DataContext 放在特定的命名空间中,也可以将各种实体放在特定的命名空间中(尽管 DataContext 中的每组实体只有一个命名空间)。您可以在“属性”窗口中执行此操作。这将让您保持 Intellisense 不那么混乱。

      【讨论】:

        【解决方案4】:

        您应该创建允许您执行工作单元的上下文。这可能涉及重叠的表映射。

        上下文 1:客户有许多发票

        上下文2:客户有很多订单

        Context3 : Invoice 有很多订单

        【讨论】:

        • 我有这个想法,但是来自 Context2 的订单不能在 Context3 中使用……你最终会得到两个不同的订单实体
        • 如果作品被分割成单元,你永远不会尝试在 context3 中使用 context2 中的对象。
        • 我实际上想在 LINQ 实体之上实现 POCO 和工作单元,因此客户端代码将与只有一种订单类型的 UnitOfWork 一起使用。在您提出的解决方案中,我不知道订单使用什么上下文
        • 如果您只有一个订单工作单元,您显然不需要该工作单元的两个上下文定义。
        猜你喜欢
        • 2011-06-22
        • 2010-09-18
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多