跨多个数据库的ADO.Net实体框架

6

在Linq2Sql中,你可以通过将数据库名称添加到源中来连接数据上下文到多个数据库

在Linq 2 Entities / ADO.net Entity Framework中是否有实现这一点的方法?数据库名称是否可以添加到表名中?

我尝试将'Schema'从dbo更改为MyDatabase.dbo,但EF将其封装成

SELECT FROM [MyDatabase.dbo].[MyTable]

欺骗性的操作,比如将'Schema'更改为'MyDatabase].[dbo',将被转义为。
SELECT FROM [MyDatabase]].[dbo].[MyTable]

(注意这两个]]。)

2个回答

8

首先,这不是官方支持的

你所链接的关于LINQ to SQL的答案只是利用数据库服务器执行异构查询的能力。我认为这对实体框架也有效,因为这是一个数据库服务器的功能,而不是任何一个框架的特性。换句话说,LINQ to SQL仍然像只涉及一个数据库服务器一样处理连接。但请注意,并非所有的数据库服务器都能做到这一点。

至于在EDMX中需要更改什么,请查找“SSDL内容”部分中EntitySet节点的Schema属性。

这种技术的一个注意事项是,当您从数据库更新模型时,存储模型会被清除并重新创建。因此,您需要重新应用这些更改。这在LINQ to SQL中不是问题,因为LINQ to SQL根本不支持从数据库自动更新。

一个更好的选择可能是在数据库中创建一个引用其他数据库的视图,并将该视图映射而不是直接映射表和其他数据库。


如果每个数据库都在同一数据库服务器上,视图功能运行良好,否则你会跨越多个数据库。在 sql 2005+ 中,我相信同义词也可以起作用,但我不确定。至于更改丢失的问题,如果停止使用设计并手动编辑四个文件,则不再是问题。 - NikolaiDante
Nath,如果在不同的服务器上,你需要使用链接服务器(使用EF或LINQ-to-SQL)。Sam,那你可以尝试使用VIEW方法。 - Craig Stuntz
Craig,我需要在运行时切换一些数据库,我不知道如何使用视图来解决这个问题 - 所以我又卡住了(再次)。 - Sam
不能使用LINQ到SQL技术来完成这个需求。我认为你需要使用一个单独的模型并且更改连接字符串。请参考http://blogs.msdn.com/adonet/archive/2008/11/25/working-with-large-models-in-entity-framework-part-2.aspx。 - Craig Stuntz
Craig,连接字符串是我的问题源:我不会为每个数据库使用EF,但它们需要共享一个连接字符串。这是一个问题,因为每个连接字符串只能有一个当前数据库。 - Sam
显示剩余3条评论

1
如果您的数据库支持SQL Synonyms,您可以将两个数据库定义合并到一个文件中。最近我就这样做了,并在这里发布了如何操作的文章,如果您感兴趣可以看一下。
基本上,您需要在databaseA上创建指向databaseB的同义词,为每个数据库创建单独的edmx文件,然后运行脚本将edmx文件合并成一个连接到已设置同义词的任何数据库的单个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接