1

如何使用兩個EDMX,在單獨的程序集中,但在SAME數據庫之上,
創建一個linq-to-entities查詢,並使用它們兩者?EF:交叉edmx(相同的數據庫)linq-to-entites查詢

E.g.

這就是我要做的:

using (var context1 = new Entities1()) 
{ 
    using (var context2 = new Entities2()) 
    { 
     var items2 = context2.Items.Where(item2 => item2.Color == "Red"); 

     var query = context1.Items.Where(item => 
      items2.Any(item2 => item2.PainterId == item.PainterId)); 
    } 
} 

 >這導致NotSupportedException異常。
   消息:「指定的LINQ表達式包含對與不同上下文關聯的查詢的引用。」

 >此異常是拋出即使Entities2替換實體1
   (即使兩個上下文是從相同EDMX)和二者使用相同的連接字符串。



爲了對比,這從另一方面內容和成果在一個單一的SQL語句:

using (var context1 = new Entities1()) 
{ 
    var items2 = context2.Items.Where(item2 => item2.Color == "Red"); 

    var query = context1.Items.Where(item => 
     items2.Any(item2 => item2.PainterId == item.PainterId)); 
} 


約束:

我的意圖是使用兩個EDMXs擁有設計師支持 - 不會破壞設計師或在從數據庫更新時被覆蓋的方式破解EDMX。

EDMX#1不知道EDMX#2(然而#2可以知道關於#1)。

我希望結果轉換爲單個SQL查詢,而不是從第一部分讀取結果到內存,然後將它們返回到數據庫作爲查詢第二部分的輸入。



相關,但不是我要找:

回答

2

您以回答您的問題的方式限制了您的需求:不,這是不可能的。最好的和唯一推薦的解決方案是在第二個鏈接中引用ADO.NET團隊博客關於使用大型模型的文章。

我寫了關於a hack(我成功地在一個項目中使用),它也可以工作,但它有另一個缺點 - 你必須爲兩個EDMX使用單一的上下文。即使它工作,我不建議使用這種方式,因爲它可能有未被發現的缺點,因爲它在內部省略了EF中許多其他地方使用的容器名稱。

+0

我預計這將需要使用一個單一的背景和我檢查合併EDMXs做到這一點的方法,但是,你的黑客可能更簡單。 – 2011-05-25 08:16:43

+0

內部使用的容器名稱是什麼? – 2011-05-25 08:17:56

+0

- 用於緩存ObjectContext的元數據,以更快地創建上下文? – 2011-05-25 15:46:32

0

另一種破解工作,將兩個EDMX合併爲第三個,然後創建一個訪問這兩個部分的ObjectContext。

所有3個EDMX都需要使用相同的命名空間。

合併可以編程方式執行,合併結果應該是: EDMX,SSDL,CSDL,MSL文件;用於T4的EDMX以及用於嵌入資源的其他工具。

兩個源EDMX中的任何實體和關聯都必須具有完全相同的定義(概念和映射)。

您將能夠在通過兩個源EDMX運行的合併的EDMX上下文上運行查詢, 通過ID或任何其他條件進行連接。


請參閱此鏈接的詳細信息在佈線了結果:
How can I create an ObjectContext from separate ssdl + csdl + msl files and no edmx?