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

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

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

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

===============>>#1 票数:28 已采纳

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

LINQ to SQL DataContext的生命周期

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

  1. 非常适合“工作单元”方法
  2. 也是为“无状态”服务器操作而设计的
  3. 不适合长期使用
  4.  Should be used very carefully after any SumbitChanges() operation. 

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

===============>>#2 票数:5

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

===============>>#3 票数:4

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

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

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

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

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

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

此外,工作单元概念与原始问题并不真正相关。 工作单元通常是指单个DC 实例正在执行的工作量,而不是DC 能够执行多少工作。

===============>>#4 票数:4

我认为约翰是正确的。

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

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

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

===============>>#5 票数:2

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

  ask by Yaakov Ellis translate from so

未解决问题?本站智能推荐: