我有点像Linq新手,我找不到任何文档可以帮助我解决看似微不足道的问题 - 所以我们非常感谢您的帮助!
我在数据库Table1
中有一个表DB1
,它在数据库Table2ID
中有一个“伪”外键Table2
到表DB2
,在同一台服务器“Pseudo”,因为很明显我不能拥有一个跨越两个数据库的实际 FK。
现在我正在玩O / R设计师,我喜欢将数据库对象带入设计师时生成所有关系的方式......非常酷!我希望我的Table1
对象与Table2
建立关系,就像它与DB1
中所有与“真正的”外键相关的对象有关系一样。但我无法将Table2
带入我的数据库图表中,因为它位于错误的数据库中。
要综合这一点,我尝试在Table2
中创建一个视图DB1
,它只是select * from DB2..Table2
。啊哈,现在我可以将Table2
对象放入我的图表中。我甚至可以在Table1
和Table2
之间建立父/子关系。但是,当我查看生成的代码时,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违规。知道为什么会这样,以及如何绕过它?
答案 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">
您实际上可以通过查看表的属性并更改源来实现此目的。