您也可以使用视图(如果另一个数据库位于不同的服务器上,则使用链接服务器)来执行此操作。这将使您不必管理/合并两个单独的 edmx 文件。我已经将它与链接服务器一起使用,以从不同服务器上的第二个数据库读取数据,但运行了一些快速测试以查看是否可以进行更新/插入/删除,并且确实如此。
我对分布式事务的经验为零,因此与分布式事务相关的信息可能是好的、坏的或两者兼而有之。 如果您的两个数据库在同一台服务器上,我假设分布式事务不再适用。
使用链接服务器时需要记住几件事。
- 当您修改链接数据库表中的实体并调用
SaveChanges
您的上下文时,这将尝试启动分布式事务,因此除非有人知道如何停止它,否则您需要确保将两个服务器设置为处理分布式事务。(我认为使用同义词也是如此)。
- 在链接服务器上插入具有标识列的实体会引发异常,因为 ef 尝试使用新 id 来获取
SCOPE_IDENTITY()
它并且它为空。我不知道有没有办法解决这个问题。我在使用标识列更新或删除链接服务器上的实体时没有任何问题。
在 SQL Server A 上
- 创建一个到 ServerB 的链接服务器(如果数据库在同一台服务器上,请跳过此步骤)。
- 为要访问
[ServerA].[MyDB]
的每个表创建一个视图[ServerB].[AnotherDB]
在 EDMX 中
- 将您的视图添加到 edmx 文件
- 从设计器中的每个属性中清除实体键设置(包括实际的pk)
- 重置实际 pk 的实体键
- 根据需要添加关联
- 保存更改
对于更新/插入/删除
- 右键单击您的 edmx 文件并使用 xml 编辑器打开
- 导航到
StorageModel
-> Schema
->EntityContainer
- 找到实体的实体集并删除
DefiningQuery
元素
- 找到
store:Schema
实体集上的属性并删除store:
,使其只是Schema
. 别管它的价值。
- 对来自链接服务器的每个视图重复步骤 3 和 4
- 保存更改
因为使用链接服务器创建了一个分布式事务,所以在成功ObjectContext
之前我必须做几件事。SaveChanges
ctx.Connection.Open();
ctx.ExecuteStoreCommand("set xact_abort on");
ctx.SaveChanges();
ctx.Connection.Close();
您可能可以创建一个自定义ObjectContext
并覆盖SaveChanges
来添加这些东西。