多个DataContext类是否合适?

为了在ASP.net 3.5应用程序中充分使用LinqToSql,有必要创建 DataContext classes (通常使用设计师在VS 2008)。从用户界面的角度来看,DataContext是您希望通过LinqToSql公开的数据库部分的设计,并且是设置LinqToSql的ORM功能的一部分。

我的问题是:我正在设置一个使用大型数据库的项目,其中所有表以某种方式通过外键互连。我的第一个倾向是建立一个模拟整个数据库的巨大的DataContext类。这样我可以理论上(尽管我不知道这是否需要在实践中)使用通过LinqToSql生成的外键连接轻松地在我的代码中的相关对象之间插入相关对象等。

然而,在给出了一些想法之后,我现在认为创建多个DataContext类会更有意义,每个类都与我的数据库中的特定命名空间或逻辑相关部分有关。我主要关心的是,对于与数据库的特定区域相关的单个操作,实例化和处理一个巨大的DataContext类将会对应用程序资源施加不必要的强制。此外,创建和管理较小的DataContext文件比一个大的文件更容易。我会失去的是,会有一些遥远的数据库部分,无法通过LinqToSql导航(即使关系链将它们连接到实际的数据库中)。另外,还会有一些表类存在于多个DataContext中。

对于一个非常大的DataContext类(对应于整个数据库)是否适合使用多个DataContext(对应于DB名称空间)是否合适(或除此之外),是否有任何想法或经验?

0
额外 编辑
意见: 1

5 答案

我在同一个问题上争论不休,而在传统数据库上复制LINQ to SQL。我们的数据库有点大(150张表),经过一些思考和实验后,我选择使用多个DataContext。这是否被认为是反模式还有待观察,但现在它使生活易于管理。

0
额外

我不同意接受的答案。在提出的问题中,系统具有一个单一的大型数据库,几乎每个表之间都有强大的外键关系(也是我工作的情况)。在这种情况下,将其分解为更小的DataContext(DC)有两个直接的和主要的缺点(这两个问题都提到了):

  1. You lose relationships between some tables. You can try to choose your DC boundaries wisely, but you will eventually run into a situation where it would be very convenient to use a relationship from a table in one DC to a table in another, and you won't be able to.
  2. Some tables may appear in multiple DC's. This means that if you want to add table-specific helper methods, business logic, or other code in partial classes, the types won't be compatible across DC's. You can work around this by inheriting each entity class from its own specific base class, which gets messy. Also, schema changes will have to be duplicated across multiple DC's.

现在这些是显着的缺点。有足够的优势来克服它们吗?这个问题提到了性能:

我主要关心的是实例化和处理一个巨大的   DataContext类始终为与之相关的各个操作提供服务   到数据库的特定区域将是不必要的   强加在应用程序资源上。

事实上,一个大型的DC在一个典型的工作单元中需要更多的时间来实例化或使用,这并不是事实。实际上,在正在运行的进程中创建第一个实例后,几乎可以立即创建相同DC的后续副本。

来自多个DC的具有彻底外键关系的单个大型数据库的唯一真正优势是您可以更好地划分您的代码。但是你已经可以用部分类来做到这一点。

另外,工作单元的概念与原始问题并不真正相关。工作单元通常指单个DC 实例 正在做的工作量,而不是DC class strong>是

0
额外

我认为约翰是正确的。

“我主要担心的是,对于与数据库的特定区域相关的单个操作,实例化和部署一个巨大的DataContext类将会对应用程序资源施加不必要的强制”

你如何支持这种说法?您的实验表明,大DataContext是性能瓶颈?拥有多个数据上下文很像有多个数据库,并且在类似的情况下也很有意义,也就是说,很少。如果您正在处理多个数据上下文,则需要跟踪哪些对象属于哪个数据上下文,并且无法关联不在同一数据上下文中的对象。这是一种昂贵的设计气味,没有真正的好处。

@Evan“DataContext(或Linq to Entities ObjectContext)更像是一个”工作单元“而不是一个连接” 这正是为什么你不应该有多个数据上下文的原因。你为什么一次要多一个“工作单位”?

0
额外
是的,在假定大型DC需要更多时间实例化时,OP是不正确的。实际上,在正在运行的进程中创建第一个实例之后,几乎可以立即创建相同DC的后续实例。
额外 作者 Jordan Rieger,

我不同意约翰的回答。 DataContext(或Linq to Entities ObjectContext)比连接更像是“工作单元”。它管理更改跟踪等。请参阅此博客文章以获取说明:

生命周期的LINQ to SQL DataContext

这篇博文的四个要点是DataContext:

  1. 非常适合 对于“工作单元”方法
  2. 也是为了 “无状态”服务器操作
  3. 不适用于     长期使用
  4.  之后应该非常小心地使用
    任何SumbitChanges()操作。
    </代码> 

考虑到这一点,我不认为使用多个DataContext会造成任何伤害 - 事实上,为不同类型的工作创建不同的DataContext将有助于使您的LinqToSql转换更加便于使用和组织。唯一的缺点是你不能使用sqlmetal来自动生成你的dmbl。

0
额外

在我使用LINQ to SQL和LINQ to Entities的经验中,DataContext与数据库的连接是同义词。因此,如果您要使用多个数据存储,则需要使用多个DataContext。我的直觉反应是,你不会注意到DataContext包含了大量表格。但是,如果确实如此,则可以始终将数据库按逻辑分割,以便可以将与其他表集没有任何关系的表分隔开并创建多个上下文。

0
额外