我正在使用ASP.NET 3.5开发一个web应用程序。应用程序有数百个表。在一次研讨会上,我被告知,我应该为整个应用程序使用一个.DBML文件,而不是使用多个.DBML文件(堆栈溢出中也有一篇文章说了同样的话)。考虑到我有这么多表,那么使用一个.DBML文件是有意义的,还是创建逻辑分组的多个.DBML文件更好呢?
例如,我正在考虑创建以下.DBML文件:
我在使用多个.DBML文件时所关心的问题之一是如何处理跨.DBML文件的更新。例如,当输入新的销售订单时,如果必须更新customer表上的字段。我该怎么处理呢?我当然不想将customer表包括在Customer和Sales .DBML文件中。我能用TransactionScope包装这些操作吗?
我不知道以下内容是否对答案有任何影响,但我的计划是使用存储库模式和POCO类,以便对.DBML文件中的表定义的引用对我的数据访问层是本地的。
谢谢
发布于 2010-02-23 13:55:05
我必须建议您对所有表使用ONE dbml文件。
如果您正在尝试join two tables from different data contexts,它会使您的代码变得更加复杂。这可以由simulating cross context joins来完成,但是为什么要把自己放在那种情况下呢?保持简单愚蠢。
另外,如果您确实决定使用2个或更多的dbml文件,并且错误地将相同的表添加到多个数据上下文中,那么您将得到一个"This member is defined more than once” error。
发布于 2010-02-23 14:31:41
我做过一个项目,如果团队决定将域分离到四个不同的DBML文件中。出现这种情况的主要原因与LINQ设计器有关。这位设计师的设计并不适合用于大域名。
这四个“子域”在这个项目是合理地分开,但有一些重叠和这位我们一直。有了这种经验,我建议您在每个域使用一个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();
}
}
}这是我大多数时候使用的模型,即使只有一个DataContext。但是,连接和事务的创建是抽象的,因此在代码中只有一个地方进行事务处理。
发布于 2010-02-23 15:58:30
我有一个相当大的项目,大约有200个表,它在一个数据上下文中工作得很好;因为所有的数据都是相当相互关联的(设计在第二和第三种范式之间),使用多个数据上下文将是一件痛苦的事。
在应用程序需要对被拆分的表执行查询的区域,多个上下文问题并不有趣;由于LINQ的工作方式和向下钻取的层次结构,您必须确保某些表处于单独的数据上下文中。至少从方便的角度来看,这并不是不可能做到的。
HTH。
https://stackoverflow.com/questions/2318536
复制相似问题