Linq to Sql - 多个.DBML文件或一个.DBML文件

mik*_*ner 29 database .net-3.5 linq-to-sql

我正在使用ASP.NET 3.5开发Web应用程序.该应用程序有数百个表.我在研讨会上被告知我应该为整个应用程序使用一个.DBML文件,而不是使用多个.DBML文件(stackoverflow中也有一个帖子说同样的事情).鉴于我有这么多表使用一个.DBML文件是有意义的还是我最好创建逻辑分组的多个.DBML文件?

例如,我正在考虑创建以下.DBML文件:

  • 顾客
  • 供应商
  • 雇员
  • 销售订单

我对使用多个.DBML文件的一个担忧是如何处理.DBML文件的更新.例如,如果在输入新的销售订单时我必须更新客户表上的字段.我该怎么处理?我当然不希望在Customer和Sales Order .DBML文件中包含customer表.我可以在TransactionScope中包装操作吗?

我不知道以下是否对答案有任何影响,但我的计划是使用存储库模式和POCO类,以便.DBML文件中对表定义的引用对我的数据访问层是本地的.

谢谢

jin*_*ngy 11

我不得不建议你为所有表使用一个 dbml文件.

如果您尝试从不同的数据上下文连接两个表,它会使您的代码更复杂.它可以通过模拟交叉上下文连接来完成,但为什么要让自己处于这种情况.保持简单愚蠢.

此外,如果您决定使用2个或更多dbml文件,并且错误地将同一个表添加到多个数据上下文,那么您将收到"此成员定义多次"错误.


Ste*_*ven 6

我参与了一个项目,团队决定将域分成四个不同的DBML文件.这种吐痰的主要原因与LINQ to SQL设计器有关.设计师不是为了与大域一起使用而构建的.

这个项目中的这四个"子域"是相当分离的,但是有一些重叠,这一直是我们的一点点.有了这种经验,我建议你每个域使用一个DBML文件.通常每个数据库都有一个域,因此这意味着每个数据库有一个DBML文件.

就个人而言,我反对在生产代码中使用TransactionScope(但我一直用它来进行集成测试),但这是另一个讨论.但是,当您决定使用多个DBML文件并且具有需要创建多个DataContext类的用例时,可以在同一事务中运行它们,如下所示:

using (var con = new SqlConnection("constr"))
{
    con.Open();
    using (var tran = con.BeginTransaction())
    {
        using (var context = new CustomerDataContext(con))
        {
            // do some work with it
            context.SubmitChanges();
        }

        using (var context = new VendorDataContext(con))
        {
            // do some work with it
            context.SubmitChanges();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我大多数时候使用的模型,即使只有一个DataContext.但是,连接和事务的创建被抽象掉了,所以在代码中只有一个地方进行事务处理.