使用含同名表的两个DBML文件时LINQ报CS0579错误求助
解决LINQ重复TableAttribute错误的方案
这个问题我之前帮同事排查过,本质是两个DBML生成的同名实体类默认会放在同一个命名空间下,导致编译器识别到重复的[Table]属性标记,所以抛出了CS0579错误。给你几个实用的解决办法,按优先级推荐:
1. 复用单个DBML(最简洁,优先推荐)
如果两个数据库的表结构完全一致(字段、数据类型、约束都匹配),其实完全不需要两个DBML文件。你只需要保留一个DBML,然后在创建DataContext实例时传入不同数据库的连接字符串即可:
// 连接源数据库 var sourceDb = new YourDataContext(ConfigurationManager.ConnectionStrings["SourceDBConn"].ConnectionString); // 连接目标数据库 var targetDb = new YourDataContext(ConfigurationManager.ConnectionStrings["TargetDBConn"].ConnectionString); // 复制数据示例 var dataToCopy = sourceDb.YourTableName.ToList(); targetDb.YourTableName.InsertAllOnSubmit(dataToCopy); targetDb.SubmitChanges();
这种方法从根源上避免了重复类的问题,后续维护也更省心。
2. 给不同DBML指定独立命名空间
如果必须保留两个DBML(比如表结构有细微差异),可以给每个DBML生成的实体类设置不同的命名空间:
- 右键点击DBML文件,选择「属性」
- 在属性窗口的「自定义工具命名空间」(Custom Tool Namespace)中,分别设置不同的命名空间,比如
YourProject.SourceDB和YourProject.TargetDB - 保存后重新生成项目,此时两个同名的表类会处于不同命名空间,使用时通过命名空间区分:
var sourceData = new YourProject.SourceDB.SourceDataContext().YourTableName; var targetData = new YourProject.TargetDB.TargetDataContext().YourTableName;
3. 修改DBML中的实体类名称
如果不想用命名空间区分,也可以直接修改DBML设计器里的实体名称:
- 打开DBML设计器,右键点击其中一个表,选择「重命名」,比如改成
YourTableName_Target - 保存DBML后,生成的实体类名称就会不同,不会再触发重复属性错误
- 注意:如果后续从数据库刷新DBML结构,重命名的设置可能会被覆盖,需要重新调整,所以这种方法适合临时场景或者不频繁更新DBML的情况
小提示
如果修改后仍然报错,建议清理项目的bin和obj目录,然后重新生成解决方案,有时候旧的编译缓存会导致奇怪的冲突。
内容的提问来源于stack exchange,提问作者asal
相关产品推荐
相关产品推荐

