2013-01-15 37 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模型映射仍然工作正常,尊重列屬性,不需要意見,並要求沒有存儲的特效。