多个DataContext类是否合适?

时间:2008-08-05 05:54:35

标签: asp.net .net linq-to-sql datacontext

为了在ASP.net 3.5应用程序中完全使用LinqToSql,有必要创建DataContext classes(通常使用VS 2008中的设计器完成)。从UI的角度来看,DataContext是您希望通过LinqToSql公开的数据库部分的设计,并且是设置LinqToSql的ORM功能所不可或缺的。

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

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

关于多个DataContexts(对应于DB名称空间)是否适合代替(或除了)一个非常大的DataContext类(对应于整个DB)的任何想法或经验?

5 个答案:

答案 0 :(得分:27)

我不同意约翰的回答。 DataContext(或Linq to Entities ObjectContext)更像是一个“工作单元”而不是连接。它管理变更跟踪等。有关说明,请参阅此博客文章:

Lifetime of a LINQ to SQL DataContext

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

  1. 非常适合 对于“工作单位”的方法
  2. 也是专为 “无状态”服务器操作
  3. 不适合     长期使用
  4. Should be used very carefully after
    any SumbitChanges() operation.
    
  5. 考虑到这一点,我不认为使用多个DataContext会造成任何伤害 - 事实上,为不同类型的工作创建不同的DataContexts将有助于使您的LinqToSql更加可用和有组织。唯一的缺点是你将无法使用sqlmetal自动生成你的dmbl。

答案 1 :(得分:5)

我一直在争论相同的问题,同时在旧版数据库上复制LINQ to SQL。我们的数据库有点大(150个表),经过一些思考和实验,我选择使用多个DataContexts。这是否被视为反模式仍有待观察,但现在它使生活变得易于管理。

答案 2 :(得分:4)

我认为约翰是正确的。

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

您如何支持该声明?您的实验表明大型DataContext是性能瓶颈的原因是什么?拥有多个datacontexts很像拥有多个数据库,并且在类似场景中也很有意义,也就是说,几乎没有。如果您正在使用多个datacontexts,则需要跟踪哪些对象属于哪个datacontext,并且您无法关联不在同一数据上下文中的对象。这是一种昂贵的设计气味,没有真正的好处。

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

答案 3 :(得分:4)

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

  1. 您失去了某些表之间的关系。您可以尝试明智地选择您的DC边界,但最终会遇到一种情况,即使用表中的关系非常方便DC到另一个桌子,你将无法做到。
  2. 某些表可能出现在多个DC中。这意味着如果要在部分类中添加特定于表的辅助方法,业务逻辑或其他代码,则这些类型将不兼容DC的。您可以通过从其自己的特定基类继承每个实体类来解决此问题,这会变得混乱。此外,架构更改必须跨多个DC进行复制。
  3. 现在这些都是显着的缺点。有足够的优势来克服它们吗?问题提到了绩效:

      

    我主要担心的是实例化和处理一个巨大的   DataContext类始终用于相关的各个操作   对数据库的特定区域施加不必要的   强加于应用程序资源。

    实际上,大型DC需要更多时间来实例化或在典型的工作单元中使用。实际上,after the first instance is created in a running process, subsequent copies of the same DC can be created almost instantaneously

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

    此外,工作单元概念与原始问题并不真正相关。工作单元通常指的是单个DC 实例 的工作量,而不是指DC 强烈> 能力

答案 4 :(得分:2)

根据我使用LINQ to SQL和LINQ to Entities的经验,DataContext与数据库的连接是同义词。因此,如果您要使用多个数据存储,则需要使用多个DataContexts。我的直觉反应是你不会注意到包含大量表格的DataContext会减慢很多。但是,如果你这样做了,你总是可以逻辑地将数据库拆分到可以隔离与其他表集没有任何关系的表并创建多个上下文的点。