5

我是一个 Linq 新手,我找不到任何文档来帮助我解决似乎是一个非常微不足道的问题 - 所以你的帮助将不胜感激!

Table1在数据库中有一个表,它在同一台服务器上DB1有一个“伪”外键Table2IDTable2数据库中的表。DB2“伪”,因为显然我不能有一个跨越两个数据库的实际FK。

现在我在玩 O/R 设计器,我喜欢将数据库对象带入设计器时生成所有关系的方式……非常酷!我希望我的Table1对象与 有关系Table2,就像它与 中的所有“真实”外键相关对象有关系一样DB1。但我不能带入Table2我的数据库图,因为它在错误的数据库中。

为了综合这一点,我尝试在 中创建一个视图Table2DB1这很简单select * from DB2..Table2。啊哈,现在我可以将一个Table2对象放入我的图表中。Table1我什至可以在和之间建立父/子关系Table2。但是当我查看生成的代码时,Table1仍然与 没有任何关系Table2,这让我感到最困惑。

我在某处错过了一步吗?有没有更好/推荐的方法来做到这一点?

谢谢!


之后...

按照一个人的建议,我尝试通过复制同一数据库中相关对象的所有结构来填充部分类,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 违规。知道为什么会发生这种情况,以及如何解决它吗?

4

3 回答 3

4

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

于 2009-04-23T19:30:35.890 回答
0

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

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 = 设置为您的视图而不是另一个数据上下文...

于 2009-04-23T17:09:03.607 回答
0

假设您可以从另一个数据库访问一个数据库,您可以通过手动编辑 .dbml 文件来做到这一点。

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

您实际上可以通过查看表的属性并更改源来做到这一点。

于 2009-04-23T17:12:51.757 回答