每个解决方案有多少个linq-to-SQL datacontext?我得到“成员被定义不止一次”的错误

时间:2011-01-10 21:31:14

标签: linq

我有一个关系数据库,大约有15个表,将在4个不同的aspx页面中使用(现在)。每个aspx页面都使用一些表,但不会同时使用所有表:例如,一个页面可能使用4个表,而另一个页面可能使用6个表。我开始为第一个aspx文件做一个dbml文件,只需要4个表。当我到达第二个aspx文件时,我做了另一个dbml文件,只有这个aspx文件需要的6个表。其中2个表在两个datacontext dbml文件中,我得到一个“成员被定义多次”错误。

在阅读了一些在线帖子后,关于dbml文件的问题是这样的:当使用linq-to-SQL时,对于一个应用程序,我们可以使用相同的表创建多个dbml文件,还是只需要为一个dbml文件创建一个dbml文件整个应用程序,因为一个表只能在一个dbml文件中。如果是后者,我们是否需要简单地在dbml文件中包含每个数据库表,然后在整个项目中始终使用相同的datacontext。

感谢。

3 个答案:

答案 0 :(得分:2)

dbml文件应该不是问题,但我想你正在使用自动生成代码的设计器 - 如果在同一命名空间中使用两个设计器,则类名将发生冲突。你有三个选择:

  1. 不同的名称空间
  2. 自己做代码生成
  3. 对所有表使用一个datacontext。
  4. 就个人而言,我总是使用3.,因为linq-to-sql确实支持延迟加载,即。如果您不查询任何数据,将不会花费任何资源。

答案 1 :(得分:0)

dbml文件(在设计时间之后)无关紧要。重要的是它们生成的Designer.cs文件。

听起来您可以使用1个dbml文件,然后手动编写CustomDataContext类来满足每个页面的需求。

答案 2 :(得分:0)

'成员被定义多次'错误发生,因为在一个名称空间中有两个同名的类。

假设您的一个表名为Product。将该表拖到dbml上时(或者更确切地说,当您保存dbml时),设计器会在默认命名空间中生成大量代码,包括名为Product的类,其中包含所有数据库列的属性。这就是你想要的,但是如果你然后在同一个命名空间中创建另一个dbml文件,并将Product拖到第二个dbml文件上,你将在同一个命名空间中得到两个Product类 - 因此“定义不止一次”。

解决方案是更改dbml设计器上的Entity Namespace属性。打开dbml,不选择任何表或关系,打开属性窗口。在代码生成组下,有一个名为Entity Namespace的属性。如果您将其更改为其他内容,则可以解决问题。

e.g。您可以将其从MyProject更改为MyProject.CustomersMyProject.Inventory

正如Femaref所指出的,另一个选择是对所有页面使用单个datacontext。从我读到的这可能是更常见的模式。当我有大量表时,我只使用了多个上下文,因为单个dbml方法是无法管理的。但无论什么对你有用!