Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq连接不同数据库中的表?_C#_Linq_Linq To Sql_Views_Or Designer - Fatal编程技术网

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

C# 如何使用Linq连接不同数据库中的表?,c#,linq,linq-to-sql,views,or-designer,C#,Linq,Linq To Sql,Views,Or Designer,我是一个Linq新手,我找不到任何文档来帮助我解决一个看似微不足道的问题,因此非常感谢您的帮助 我在数据库DB1中有一个表Table1,它在同一台服务器上的数据库DB2中的表Table2中有一个“伪”外键Table2ID。“伪”,因为很明显我不能有一个跨越两个数据库的实际FK 现在我在玩O/R设计器,我喜欢将数据库对象引入设计器时生成所有关系的方式。。。很酷!我希望我的Table1对象与Table2有一个关系,就像它与DB1中所有“真实”外键相关对象有关系一样。但是我不能将表2放入我的db图中,

我是一个Linq新手,我找不到任何文档来帮助我解决一个看似微不足道的问题,因此非常感谢您的帮助

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

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

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

我是不是错过了一步?有没有更好的/推荐的方法

谢谢


后来。。。 按照一个人的建议,我尝试通过复制同一数据库中相关对象的所有结构,用访问
Table2
所需的所有方法填充
Table1
的部分类

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

尝试附加或添加非新实体,可能是从另一个DataContext加载的。不支持此操作。

因此,看起来Linq的设计者实际上已经考虑过这个场景,并决定不允许您连接不同数据库中的对象。真是太遗憾了…:(


……甚至后来。。。
感谢@williammandra.com,我发现您需要在视图上手动创建主键。但还有另一个问题:出于某种原因,当您从视图
表2
加载一个值并将其设置到新记录
表1
,然后提交更改时,它会尝试将一个新的记录插入
表2
,这显然会导致PK冲突。知道为什么会发生这种情况,以及如何解决吗?

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


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

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

问题是,如果他需要重新生成dbml,他的更改将丢失,这将起作用,但这并不是我想要的效果“我正在努力。如果在同一个数据库中有两个表,那么O/R设计器将在这两个表之间创建一个关系,例如Table1.Table2-我希望在我的数据上下文中有相同的接口,只是Table2位于不同的数据库中。您应该能够右键单击dbml设计器中的视图,然后转到add->association来创建它们之间的关系。”谢谢你——我是在你自己写的同时发现这个问题的。唯一的问题是,当你把“外键”从视图中加载到一个值时,它是不接受的;它试图插入一个新的记录,你得到主键违反错误。“秘密切换”是为了解决这个问题?啊哈,我在一个相关的表格中遇到了同样的问题。因此,这不仅仅是关于视图的问题。正确回答这个问题的功劳(和奖金!)就在这里,我将下一个问题作为一个单独的问题发布。谢谢!在