LINQ to SQL 多个 DataContext 的问题

11

我正在尝试找出如何组织DataContexts的最佳策略。我们通常使用的数据库通常有50到100个表,基本上都是第三范式,并且它们之间有很多关系。我认为我们有两个选项:

  1. 将所有表都放在单个上下文中。这将确保我们所做的任何事情都会按正确的顺序提交到数据库。问题是LINQ设计器将混乱不堪,而且我担心性能可能会受到影响。
  2. 根据表的逻辑分组创建几个数据上下文。问题是某些关系的一侧将在一个上下文中,而另一侧将在另一个上下文中。我们必须手动确保以正确的顺序提交两个上下文。

是否有任何建议的做法来处理这个问题?

更多详情:

我想在LINQ to SQL的基础上创建自己的实体和工作单元。实体将在xml模型文件中定义,其中还将指定与LINQ实体的映射。自定义工具将基于该模型生成我的实体(POCO)。客户端代码将仅与我的实体和我的工作单元交互;永远不直接与DataContext或LINQ实体交互。但是,我不想复制LINQ to SQL所提供的内容,因此我想使用底层的LINQ DataContext。这意味着我不能在不同的数据上下文中有两个具有不同顺序的订单,因为无法将我的POCO Order与它们两个都映射。

4个回答

4

这里的术语是指在一个方法内部只有一个DataContext db = new DataContext(),并且在锁定对象(或执行某些操作以确保一次只有一个对象存在)的情况下发生吗? - paIncrease

2
LINQ-to-SQL映射类似于类型化的数据集,使用时您将处理包含数据的会话。您可以在多个不同的DataContext中拥有相同的表。毕竟,它们只是类;除非您开始通过填充现有数据或使用它们创建新数据与数据库交互,否则它们没有任何意义。
因此,也许您在发送新目录时要处理客户、地址、电话等表。然后,在创建订单时,您需要使用发票、行项目、产品等表。但是在后者中,您可能也想要有客户。这没问题。您应该注意一次只有一个会话处于活动状态,以便您不会使用不一致的数据。只要您不以重叠的方式使用,您在不同的DataContext中重叠的实体就不应该出现问题。
至于混乱的情况,您可以将DataContext放入特定的命名空间中,并且还可以将各种实体放入特定的命名空间中(尽管每个DataContext中的实体集只能有一个命名空间)。您可以在“属性”窗口中执行此操作。这将使Intellisense更加简洁。

0
你应该创建上下文,允许你执行“工作单元”。这可能涉及重叠的表映射。
上下文1:客户有多个发票
上下文2:客户有多个订单
上下文3:发票有多个订单

我曾经考虑过这个问题,但是从Context2中获取的订单无法在Context3中使用...这样会得到两个不同的订单实体。 - Albert
如果将工作分成单元,您永远不会尝试在context3中使用来自context2的对象。 - Amy B
我实际上想在LINQ实体的基础上实现POCOs和工作单元,这样客户端代码将使用一个只有一种类型订单的工作单元。在您提出的解决方案中,我不知道要为订单使用哪个上下文。 - Albert
如果您只有一个订单工作单元,那么显然您不需要为该工作单元定义两个上下文。 - Amy B

0

我每个数据库使用一个数据上下文(datacontext)。

平均表格可能多达100个,但从经验来看,我没有遇到任何性能问题。

数据上下文是在一个单独的项目中编译的。生成的dll从BLL引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接