繁体   English   中英

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

[英]How do you use Linq to connect tables in different databases?

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

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

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

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

我在某处错过了一步吗? 有没有更好的/推荐的方式这样做?

谢谢!


后来...

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

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

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 ,然后提交更改时,它会尝试在Table2插入一条记录,这显然会导致PK违规。 知道为什么会这样,以及如何绕过它?

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

您可以创建两个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 ...

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM