【问题标题】:LINQ to SQL: Multiple / Single .dbml per project?LINQ to SQL:每个项目有多个/单个 .dbml?
【发布时间】:2008-12-03 16:29:53
【问题描述】:

我已阅读 Rick Strahl 在 Linq to SQL DataContext Lifetime Management 上的文章,希望找到一些关于如何管理我的 .dbml 文件的答案,因为它们与 DataContext 密切相关。不幸的是,Rick 的文章似乎侧重于 DataContext 在运行时的生命周期,而我的问题是关于在 设计时 应该如何组织 .dbml 的问题。

“.dbml 的最佳实践”has been asked and answered here 的一般问题,答案集中在管理 .dbml 的外部工具上。

我要问一个更集中的问题:您何时以及为什么在您的基于 LINQ to SQL 的项目中拥有单个 .dbml 文件

【问题讨论】:

  • 不要通过创建多个 .dbml 文件来破坏表关系和工作单元概念。如果您需要创建多个 .dbml 文件(我不推荐),请尝试满足以下条件:- 1. 如果您创建多个数据库,而这些数据库表之间没有关系。 2. 如果您只想将这些 .dbml 之一用于存储过程 3. 如果您不关心工作单元。请考虑更合适的 ORM,例如 NHibernate。

标签: linq visual-studio linq-to-sql


【解决方案1】:

请注意,LINQ2SQL 旨在以简单易用的方式处理数据库与对象的关系。

不要通过创建多个 .dbml 文件来破坏表关系和工作单元概念。

如果您需要创建多个 .dbml 文件(我不推荐),请尝试满足以下条件:-

  1. 如果您创建多个数据库,而这些数据库表之间没有关系。
  2. 如果您只想使用这些 .dbml 之一来处理存储过程
  3. 如果您不关心工作单元概念。

如果你的数据库太复杂,我会考虑 ORM 比如 NHibernate、EF 4

【讨论】:

    【解决方案2】:

    在我看来,您可以拆分 .dmbl 文件,以便每个文件根据功能和关系从数据库中保存一个表/过程的子集。我还没有这样做,所以这只是意见。

    然而,我创建了多个 .dbml 文件来帮助进行单元测试。如果您在限制您在生产环境中使用存储过程的环境中工作,那么您不能使用 .dbml 的表部分(尽管您可以使用 proc 部分)。因此,如果您对代码的 DB 层进行“单元测试”(这实际上是集成测试),您可以调用 proc 包装器,然后通过 .dbml 接口查询表来检查结果。在这种情况下,我会将 .dmbl 文件拆分为我想在“单元测试”中查询的表。

    更多信息:我构建了 2 个解决方案。一个具有单元测试,并且永远不会在构建服务器上构建。另一个是在构建服务器上构建并部署到测试/生产。

    【讨论】:

    • 我遇到的问题是生成的类需要对其 dbml 唯一的名称,即在 2 个 dbml 中有一个帐户对象将导致问题 deu 在其各自的部分类中定义了两次属性。
    【解决方案3】:

    我会说,您总是只需要 1 个 dbml-file PER 数据库。如果您与其他数据库有多个连接,请考虑设计或使用单独的 dbml 文件。无论哪种方式,每个数据库一个就足够了。

    这是因为 dbml 映射到您的表,为什么不只使用一个“数据连接器”/“数据层”,使用多个似乎很奇怪/奇怪的设计。

    也可能只使用 1 更可控。

    【讨论】:

      【解决方案4】:

      这里已经对这个问题进行了彻底的分析:http://craftycode.wordpress.com/2010/07/19/linq-to-sql-single-data-context-or-multiple/

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

      【讨论】:

        【解决方案5】:

        假设你有一个数据库:

        数据库 D 包含表 A、B、C、X、Y、Z,其中

        • 表 A 有一个外键 与表 B 和 C 的关系
        • 表 X 有一个外键 与表 Y 和 Z 的关系
        • 表 X 也与表 A 有外键关系

        假设你有 2 个基于数据库 D 的 DBML 文件 P 和 Q

        • DBML 文件 P 包含实体 A'、B' 和 C' 其中 A' 连接到 B' 和 C' 通过关联。
        • DBML 文件 Q 包含实体 X'、Y' 和 Z',其中 X' 连接到 Y' 和 Z' 通过 协会。

        AFAIK,DBML 文件 P 和 Q 无法包含实体 A' 和 X' 之间的关联。这是拥有多个 DBML 文件的最大问题。

        在我看来,DBML 文件反映了由表表示的数据模型以及数据库中这些表的约束。如果一组 DBML 文件中缺少某些表或约束,则该组 DBML 文件不能准确反映底层数据库。

        回到我们的例子,如果数据库 D 中的表 A 和 X 之间没有关系,那么可以创建 2 个 DBML 文件。

        一般来说,如果每个 DBML 文件包含所有连接的实体和关系,则可以有多个 DBML 文件。请注意,反过来也不是问题,即,一个 DBML 文件可以包含多组实体,这些实体之间没有任何关联。

        【讨论】:

          【解决方案6】:

          答案很棘手,因为情况需要。我尝试在逻辑上将每个 DBML 分离到上下文中(毕竟,DBML 提供了 DataContext 功能)。因此,如果我的应用程序只有一个上下文,那么为每个表设置单独的 DBML 对我来说没有意义。在创建 DBML 文件时,上下文为王。

          【讨论】:

            【解决方案7】:

            要记住的另一件事是 LINQ 使用 DataContext 来跟踪它创建的实体实例的身份。因此,表示由 DataContext 类的一个实例创建的表中的行的实体与由另一个实例创建的实体不同,即使所有属性都相同。

            当一个人有多个 DBML 文件时,必然会有多个 DataContexts 实例,每个 DBML 文件一个。因此,实体不能从一个 DataContext 连接或共享到另一个。

            这适用于实体存在于两个(或所有)DBML 文件中的情况。

            【讨论】:

              猜你喜欢
              • 2011-03-23
              • 2011-01-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-18
              • 1970-01-01
              • 2011-02-10
              相关资源
              最近更新 更多