我有一个关系数据库,大约有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。
感谢。
答案 0 :(得分:2)
dbml文件应该不是问题,但我想你正在使用自动生成代码的设计器 - 如果在同一命名空间中使用两个设计器,则类名将发生冲突。你有三个选择:
就个人而言,我总是使用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.Customers
或MyProject.Inventory
。
正如Femaref所指出的,另一个选择是对所有页面使用单个datacontext。从我读到的这可能是更常见的模式。当我有大量表时,我只使用了多个上下文,因为单个dbml方法是无法管理的。但无论什么对你有用!