2011-05-17 86 views
29

它是有效的做一些事情,如使实体框架模型跨越多个数据库

CREATE SYNONYM [dbo].[MyTable] FOR [AnotherDatabase].dbo.[MyTable]

,然后修改实体框架的EDMX文件中读取该对象就像任何其他表?

我做了一个快速的样品测试,它似乎工作的优良选择和更新,但我想知道是否有任何理由,我不应该这样做

我通过获取表定义创建指向第二个数据库的edmx文件,在那里构建实体,然后将定义复制/粘贴到第一个数据库的edmx文件中。

UPDATE

如果有人有兴趣,我写了什么我没有做一个EDMX文件跨度多张数据库here。它包括用于生成同义词并合并edmx文件的脚本。

+1

主要缺点我看到的是需要手动操纵EDMX,并失去了自动更新EDMX在DB模式的变化拉动的能力,有可能是。其他缺点 – camainc 2011-05-17 20:00:57

+1

@carmainc:这是一个小问题,但对我来说,它必须手动创建两个数据上下文之间的链接,并不得不多次访问服务器以获取链接的数据,而只需更新我的第二个edmx文件,并复制/粘贴新信息 – Rachel 2011-05-17 20:05:33

+0

Rachel,我偶然发现你的帖子,我想知道如果你遇到了问题,除了已经在你的文章中列出的问题...我正在考虑你的方法ERP正在公司开发我为...工作...谢谢! – 2011-05-27 19:42:35

回答

10

如果你做了一个测试,它的工作,你可能会显示一些没有人知道的东西。直到现在,我总是回答这样的问题:不可能将单个模型与两个数据库结合使用(根据隐藏第二个数据库中的表的视图,使用一些更加丑陋的解决方法)。现在我知道两个解决方法。

此方法的唯一缺点是,如果您从数据库运行更新模型,手动对EDMX的SSDL部分进行的所有更改始终会丢失。这意味着要么手动开发EDMX(这是非常艰苦的工作),要么使用一些工具/脚本,在每次从数据库更新后添加更改。

+1

事实上,你没有意识到这一点让我觉得这个想法有什么问题......我以为你知道EF的一切! :)谢谢 – Rachel 2011-05-18 12:56:42

+0

这更多关于了解数据库服务器的功能,我真的不知道EF的一切。我仍然在学习...... – 2011-05-18 13:08:01

+2

我实际上已经组合了一个脚本,它将合并edmx文件而不会覆盖您所做的更改。所以我的最终结果是一个项目持有我工作的EDMX,一个项目持有我的第二个数据库的EDMX,第三个项目运行脚本,将EDMX#2与EDMX#1合并。 – Rachel 2011-05-18 16:36:15

2

您也可以在视图(如果另一个数据库位于不同的服务器上,则为链接的服务器)执行此操作。这将使您不必管理/合并两个单独的edmx文件。我已经使用这个链接服务器来读取另一台服务器上的第二个数据库的数据,但是运行了一些快速测试,以查看更新/插入/删除是否可行。

我对分布式事务没有经验,所以与分布式事务相关的信息可能是好的,坏的或者两者都有。如果您的两个数据库位于同一台服务器上,我将不再使用分布式事务处理ASSUME

使用链接服务器时有几件事要记住。

  1. 当你修改实体链接数据库表和您的上下文调用SaveChanges,这将尝试启动一个分布式事务所以除非有人知道如何停止,你需要确保两个服务器都设置处理分布式事务。 (我会假设这也是真实的使用同义词)。
  2. 在链接服务器上带有标识列的实体上插入会抛出异常,因为ef会尝试使用SCOPE_IDENTITY()获取新标识,并且该标识为空。我不知道是否有办法解决这个问题。在使用标识列的链接服务器上更新或删除实体时,我没有任何问题。

在SQL Server中的

  1. 创建链接的服务器到ServerB(跳过这个如果分贝的是在同一台服务器上)。
  2. [ServerB].[AnotherDB]为每个表[ServerA].[MyDB]视图要访问

在EDMX

  1. 你的意见添加到EDMX文件
  2. 清除每个实体键设置物业在设计师(包括实际PK)
  3. 重置实体密钥的实际pk
  4. 加入协会根据需要
  5. 保存更改

对于更新/插入/删除

  1. 右击你的EDMX文件并使用XML编辑器
  2. 导航至StorageModel开放 - >Schema - >EntityContainer
  3. 找到您实体的实体集并删除DefiningQuery元素
  4. 找到实体集上的store:Schema属性,并删除store:,以便它只是Schema。只保留其价值。由于使用链接的服务器创建一个分布式事务,我不得不做一些事情上ObjectContext之前SaveChanges成功
  5. 重复从链接服务器
  6. 保存更改

每个视图步骤3 & 4 。

ctx.Connection.Open(); 
ctx.ExecuteStoreCommand("set xact_abort on"); 
ctx.SaveChanges(); 
ctx.Connection.Close(); 

你或许可以创建自定义ObjectContext并重写SaveChanges在添加这些东西。

+1

这就是我不想做的事......这是一大堆额外的工作。您需要创建视图,创建PK,查找和修改定义查询,并重新创建链接数据库上存在的任何链接。我宁愿更新我的EDMX文件并运行合并脚本(使维护变得简单和容易,即使对于那些不太了解EF的人)。好的信息,如果你的数据库不支持同义词,虽然。 – Rachel 2011-05-25 16:12:20

0

我发现这招用同义词工作完美与“守则第一”的方针没有任何操作与edmx文件!

您唯一要做的就是将您的类“绑定”到您的DataContext的OnModelCreating方法中的适当同义词。

例如,如果我有另一个数据库的代名词,以表人员(类名称也是人事)和同义词的名字是“MYSCHEMA。MySynonym”,则OnModelCreating方法应该是这样的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("myschema"); 

     modelBuilder.Entity<Personnel>() 
      .ToTable("MySynonym"); 

     Database.SetInitializer<TestSynonymContext>(null); 

     base.OnModelCreating(modelBuilder); 
    } 
相关问题