2013-01-15 67 views
11

有什么方法可以在Entity Framework中实现跨数据库查询?假设我有两个Entities User和Post,User实体位于database1,Post位于database2,这意味着这些实体位于不同的数据库中。我应该如何在Entity Framework中获取用户的帖子?EF中的跨数据库查询

+0

可能重复的[实体框架 - 如何管理不同数据库中的表,但在同一台服务器上?](http://stackoverflow.com/questions/11544516/entity-framework-how-to-manage-tables-in -different-databases-but-on-the-same-s) – ken2k

+0

是的,我在database1中公布了帖子,但我不明白,你是通过SQL视图还是别名**来表达**? – saber

回答

20

EF上下文不支持跨数据库查询。您需要通过SQL View(or synonym)公开database1中的帖子并将其用作该数据库的一部分。

+0

+1谢谢拉迪斯拉夫,你救了我的一天。 – saber

+0

当然,如果你想加入的数据库不是本地的,这根本不起作用。链接服务器连接也表现不佳。我希望上下文能够遵守数据库所有权链接配置选项,因为这似乎是一个可以轻松解决的基本身份验证问题。 – ewahner

4

不,你不能。你将不得不创造上下文,并加入你的自我。见here

你可以解决数据库欺骗,在一个数据库中创建一个视图,而在另一个数据库中创建一个视图。

+0

如果数据库位于同一台主机上且数据集很小,但可以接受,但通常情况下,客户端连接性能不佳,这可能是可以接受的。 – Andomar

+0

+1感谢您的回复。 – saber

9

您可以使用ExecuteStoreQuery,如:

var myOb = context.ExecuteStoreQuery<PlainOldClrObject>(
     @"select * 
      from db1.dbo.table1 t1 
      join db2.dbo.table2 t2 
      on  t2.t1_id = t1.id 
      where t1.id = {0}", 
     table1Id).FirstOrDefault(); 

你必须定义一个PlainOldClrObject类列与getter/setter方法的属性,如:

class PlainOldClrObject 
{ 
    public int Id (get; set; } 
    public int Name (get; set; } 
    ... 
} 
+0

+1好点。最简单的解决方案往往是最好的。 –

13

我知道这是一个古老的线程,但实际上。这个有可能。如果数据库位于同一台服务器上,则只需使用DbCommandInterceptor即可。

作为一个例子,如果我将DbCommandInterceptor附加到MyContext,我可以拦截所有命令执行并将查询中的指定表替换为我的full-db路径。

  public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
     // Here, I can just replace the CommandText on the DbCommand - but remember I 
     // want to only do it on MyContext 
     var context = contexts.FirstOrDefault() as MyContext; 
     if (context != null) 
     { 
      command.CommandText = command.CommandText 
       .Replace("[dbo].[ReplaceMe1]", "[Database1].[dbo].[Customers]") 
       .Replace("[dbo].[ReplaceMe2]", "[Database2].[dbo].[Addresses]") 
       .Replace("[dbo].[ReplaceMe3]", "[Database3].[dbo].[Sales]"); 
     } 

     base.ReaderExecuting(command, interceptionContext); 
    } 

的好处也对这种做法的是,EF模型映射仍然工作正常,尊重列属性,不需要意见,并要求没有存储的特效。