[英]How do you use Linq to connect tables in different databases?
我有点像Linq新手,而且我找不到任何文档可以帮助我解决看似非常微不足道的问题 - 所以我们非常感谢您的帮助!
我在数据库DB1
有一个表Table1
,它在同一服务器上的数据库DB2
表Table2
中有一个“伪”外键Table2ID
。 “Pseudo”,因为很明显我不能拥有跨越两个数据库的实际 FK。
现在我正在和O / R设计师一起玩,我喜欢将数据库对象带入设计师时生成所有关系的方式......非常酷! 我希望我的Table1
对象与Table2
有关系,就像它与DB1
所有“真正的”外键相关对象有关系一样。 但我无法将Table2
带入我的数据库图表中,因为它位于错误的数据库中。
为了综合这个,我尝试在DB1
创建一个视图Table2
,它只是select * from DB2..Table2
。 啊哈,现在我可以将Table2
对象放入我的图表中。 我甚至可以在Table1
和Table2
之间建立父/子关系。 但是当我查看生成的代码时, 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.