您也可以通过视图实现这一点(如果另一个数据库位于不同的服务器上则需要使用链接服务器)。这样可以避免管理/合并两个单独的edmx文件。我已经使用链接服务器从第二个位于不同服务器上的数据库中读取数据,但我进行了一些快速测试以确定更新/插入/删除是否可行,它们是可以的。
我完全没有分布式事务的经验,因此与分布式事务相关的信息可能好坏参半。如果您的两个数据库位于同一服务器上,我认为分布式事务不再适用。
在使用链接服务器时,有几件事情需要记住:
1. 当您修改链接数据库表中的实体并在上下文上调用“SaveChanges”时,它将尝试启动分布式事务,因此除非有人知道如何停止它,否则需要确保两个服务器设置为处理分布式事务。(我认为使用同义词也会是这样)。
2. 在链接服务器上插入具有标识列的实体会抛出异常,因为EF尝试使用“SCOPE_IDENTITY()”获取新ID,但返回值为null。我不知道是否有解决方法,但我在链接服务器上更新或删除具有标识列的实体时没有任何问题。
在SQL Server A上:
1. 创建到ServerB的链接服务器(如果数据库在同一台服务器上,则跳过此步骤)。
2. 为
[ServerB].[AnotherDB]
中要访问的每个表在
[ServerA].[MyDB]
中创建一个视图。
在EDMX中:
1. 添加您的视图到edmx文件中。
2. 在设计器中清除每个属性的实体键设置(包括实际主键)。
3. 重置实际主键的实体键。
4. 根据需要添加关联关系。
5. 保存更改。
对于更新/插入/删除:
1. 右键单击.edmx文件并使用xml编辑器打开。
2. 导航到“StorageModel” -> “Schema” -> “EntityContainer”。
3. 查找实体的entityset并删除“DefiningQuery”元素。
4. 找到实体集上的“store:Schema”属性,并删除“store:”,使其成为“Schema”。不要更改它的值。
5. 对于来自链接服务器的每个视图,重复步骤3和4。
6. 保存更改。
由于使用链接服务器会创建分布式事务,因此在“SaveChanges”成功之前,我必须在ObjectContext上做一些事情。
ctx.Connection.Open();
ctx.ExecuteStoreCommand("set xact_abort on");
ctx.SaveChanges();
ctx.Connection.Close();
你可以创建一个自定义的ObjectContext
并重写SaveChanges
来添加这些内容。