LINQ to SQL:一个项目可以有多个/单个.dbml文件吗?

13

我阅读了Rick Strahl关于Linq to SQL DataContext Lifetime Management的文章,希望能找到如何管理我的.dbml文件,因为它们与DataContext密切相关。不幸的是,Rick的文章似乎集中在运行时DataContext生命周期,而我的问题涉及到如何在设计时组织.dbml文件。

关于“最佳的.dbml实践”,已经有人在这里提出并回答了问题,而答案集中在使用外部工具来管理.dbml文件。

我要问的是一个更专注的问题:在基于LINQ to SQL的项目中,何时以及为什么应该只有单个.dbml文件?


1
不要通过创建多个 .dbml 文件来破坏表关系和工作单元概念。如果您确实需要创建多个 .dbml 文件(我不建议这样做),请尝试满足以下条件:1. 如果您创建多个数据库,这些数据库表之间没有关系。2. 如果您想仅使用其中一个 .dbml 用于存储过程。3. 如果您不关心工作单元。请考虑更适合的 ORM,如 NHibernate。 - ashraf
7个回答

8
请注意,LINQ2SQL旨在以简单易用的方式处理对象与数据库关系。
请勿通过创建多个.dbml文件来破坏表关系和工作单位概念。如果您确实需要创建多个.dbml文件(我不建议这样做),则尝试满足以下要求:
1.如果您创建多个数据库且这些数据库表之间没有关系。 2.如果您想使用其中一个.dbml来处理存储过程。 3.如果您不关心工作单位概念。
如果您的数据库过于复杂,则应考虑使用NHibernate或EF 4等ORM工具。

4
在我看来,您可以将.dmbl文件拆分为每个文件包含一个DB的子集,根据功能和关系进行分类。我还没有这样做过,这只是我的意见。
但是,我创建了多个.dbml文件来辅助单元测试。如果您在生产环境中使用存储过程受到限制,则无法使用.dbml文件的表部分(但可以使用过程部分)。因此,如果您“单元测试”(实际上是集成测试)代码的DB层,您可以调用过程包装器,然后通过.dbml接口查询表以检查结果。在这种情况下,我会将.dmbl文件拆分为我想要在“单元测试”中查询的表。
更多信息:我有两个解决方案需要构建。其中一个具有单元测试,并且从未在构建服务器上构建。另一个则在构建服务器上构建并部署到测试/生产环境中。

1
我遇到的问题是生成的类需要唯一的名称,即在2个dbml中拥有一个帐户对象会导致在它们各自的部分类中定义属性两次而引起问题。 - John Nicholas

3
我认为,每个数据库只需要一个dbml文件。如果您有多个连接到其他数据库的情况,请考虑设计或使用单独的dbml文件。总之,每个数据库只需要一个就足够了。
这是因为dbml映射到您的表,为什么不只使用一个“数据连接器”/“数据层”呢?似乎使用多个并不是一个好的设计。
只使用一个可能更易于控制。

3

1

假设你有一个数据库:

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

  • 表A与表B和表C存在外键关系
  • 表X与表Y和表Z存在外键关系
  • 表X还与表A存在外键关系

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

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

据我所知,DBML文件P和Q没有办法在实体A'和X'之间建立关联。这是拥有多个DBML文件的最大问题。

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

回到我们的例子,如果数据库D中的表A和X之间没有关系,那么就可以创建2个DBML文件。
一般来说,如果每个DBML文件包含所有连接的实体和关系,则可以拥有多个DBML文件。请注意,反过来不是问题,即可以有一个单独的DBML文件,其中包含多个实体组,它们之间没有任何关联。

0

答案很棘手,因为它取决于情况。我尝试在逻辑上将每个DBML分成上下文(毕竟,DBML提供了DataContext功能)。因此,如果我的应用程序只有一个上下文,那么对于每个表都有单独的DBML就没有意义了。在创建DBML文件时,上下文是至关重要的。


0

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

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

当实体存在于两个(或多个)DBML文件中时,这是适用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接