如何使用Linq连接不同数据库中的表?

时间:2009-04-23 16:59:07

标签: c# linq linq-to-sql views or-designer

我有点像Linq新手,我找不到任何文档可以帮助我解决看似微不足道的问题 - 所以我们非常感谢您的帮助!

我在数据库Table1中有一个表DB1,它在数据库Table2ID中有一个“伪”外键Table2到表DB2,在同一台服务器“Pseudo”,因为很明显我不能拥有一个跨越两个数据库的实际 FK。

现在我正在玩O / R设计师,我喜欢将数据库对象带入设计师时生成所有关系的方式......非常酷!我希望我的Table1对象与Table2建立关系,就像它与DB1中所有与“真正的”外键相关的对象有关系一样。但我无法将Table2带入我的数据库图表中,因为它位于错误的数据库中。

要综合这一点,我尝试在Table2中创建一个视图DB1,它只是select * from DB2..Table2。啊哈,现在我可以将Table2对象放入我的图表中。我甚至可以在Table1Table2之间建立父/子关系。但是,当我查看生成的代码时,Table1仍然与Table2没有任何关系,我觉得这是最令人困惑的。

我错过了某个地方的一步吗?有没有更好的/推荐的方法呢?

谢谢!


后来...

根据一个人的建议,我尝试通过复制相同对象的所有结构来填充Table1的部分类以及访问Table2所需的所有方法。 DB。

这实际上适用于读取,但是当我尝试更新或插入记录时,我得到了一个例外:

An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported.

所以看起来Linq的设计师实际上已经考虑过这个场景,并且决定你不允许连接不同数据库中的对象。真是太遗憾...... :(


......甚至更晚......

感谢@ williammandra.com,我发现您需要手动在视图上创建主键。但还有另一个问题:出于某种原因,当你从视图Table2加载一个值并将其设置在新记录Table1上时,然后提交更改,它会尝试插入 new 记录到Table2,这显然会导致PK违规。知道为什么会这样,以及如何绕过它?

3 个答案:

答案 0 :(得分:4)

视图没有主键(没有它,O / R设计器无法创建关系)。您使用视图的解决方案会让您到达中途....您缺少的步骤是在O / R设计器中为Table2视图中的关键字段设置“Primary Key”属性为true。您仍然需要手动创建关联,但是一旦保存dbml,关系将显示在生成的代码中。

答案 1 :(得分:0)

您可以创建两个dbml,每个db一个。然后加入查询中的表格:

var tb1 = DataContext1.Table1
var tb2 = DataContext2.Table2

var result = (from t1 in tb1
              join t2 in tb2 on tb1.column equals tb2.column
              where ...
              select ...
             )

您也可以将tb2 =设置为您的视图而不是另一个datacontext ...

答案 2 :(得分:0)

假设您可以从另一个访问一个数据库,您可以通过手动编辑.dbml文件来完成此操作。

<Table Name="Table1.dbo.Table" Member="MemberObject"> 
<Table Name="Table2.dbo.Table" Member="MemberObject">

您实际上可以通过查看表的属性并更改源来实现此目的。