【问题标题】:Linq2Sql: How to handle tables with the same name and different schema namesLinq2Sql:如何处理同名不同模式名的表
【发布时间】:2010-11-17 18:30:15
【问题描述】:

我有一个包含多个表的数据库,这些表具有相同的名称但来自不同的模式。例如:

[DatabaseName].[Schema1].[MyTable]
[DatabaseName].[Schema2].[MyTable]

当 Linq2Sql 为这个数据库生成代码时,它似乎只是从第一个模式中提取表,而完全忽略了第二个模式:

[Table(Name="[Schema1].MyTable")]
public partial class MyTable {  }

这实际上使得使用 Linq2Sql 查询第二个模式上的表成为不可能。有解决办法吗?

我的第一个想法是手动编辑生成的代码,这样我就有了:

[Table(Name="[Schema1].MyTable")]
public partial class Schema1MyTable {  }

[Table(Name="[Schema2].MyTable")]
public partial class Schema2MyTable {  }

但每次数据库更改时都必须维护此代码将是一个巨大的痛苦。还有其他想法吗?

【问题讨论】:

    标签: c# sql linq-to-sql schema


    【解决方案1】:

    看起来这在 Visual Studio 2010 中不再是问题。我创建了两个表,都名为 target,并将一个绑定到架构 a,另一个绑定到架构 a绑定到架构 b。我添加了 DBML 并将两个目标表(一个在服务器资源管理器中显示为 target (a) 和另一个 target (b))拉到设计器上。这创建了一个名为 target 的类和另一个名为 target 1 的类。生成的代码(为清楚起见进行了编辑)显示该工具现在生成的类与上面的示例代码非常相似:

    [global::System.Data.Linq.Mapping.TableAttribute(Name="a.target")]
    public partial class target
    { //... class implementation snipped
    }
    
    [global::System.Data.Linq.Mapping.TableAttribute(Name="b.target")]
    public partial class target1
    { // ... class implementation snipped
    }
    

    【讨论】:

    • 是的,它为两者生成单独的类很棒,但问题是类的名称。你怎么知道哪个模式目标指向 vs target1?我更愿意将它们命名为 atarget 和 btarget 或 a_target 和 b_target。
    • 无论是在设计器中编辑还是在生成的代码中进行编辑,每次数据库更改并且必须重新生成模型时,我仍然需要重新编辑它。
    • @lfoust - 是的,这是可悲的事实。但是,EF 工具确实允许您以粘性方式重命名实体,因此这可能是一种替代方法——尤其是在 LINQ to SQL 正在逐步淘汰的情况下。
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多