2012-05-14 25 views
1

這讓我有點惱火,至少可以說...EF和一個裝配多個SQL版本 - 這可能

我升級服務層項目,體驗最新版本,並在這個過程中「將我所有的Linq升級到Sql模型到Entity Framework。到目前爲止,我已經完成了四個數據庫,現在正在運行測試 - 我的測試失敗,出現錯誤

System.Data.MetadataException:指定的模式無效。錯誤: DB.WebDB.ssdl(2,84):錯誤0169:所有SSDL工件必須以相同的提供程序爲目標。 ProviderManifestToken'2008'與之前遇到的'2005'不同。

做一些谷歌搜索我發現這通常是由不同的開發/活的SQL服務器版本引起的。

我的情況是不同的,但是 - 我有多個活動數據庫服務器上運行不同的版本 - 2005年,2008年和2008 R2 - 我需要能夠交談的所有的人,用不同的EDMXs。

對此SO:Multiple Versions of SQL Server using Entity Framework in a single ASP.NET application看來,一種解決方案是將不同版本的EDMX分成不同的組件(即2005和2008版本)。據推測,另一個解決方案將迫使我的ProviderManifestToken在2008年源數據庫爲2005。然而,對我而言,我必須創建不同的程序集純粹只是爲了滿足EF中的一個行爲怪癖,可以讓一個EDMX打破所有其他程序的想法是荒謬的 - 對我來說,單獨的程序集是一個架構決策。同樣地,黑客使用EDMX文件降級2008數據庫也是不可取的,尤其是當下一次「從數據庫更新...」命令將其再次更改時。

任何人有一個替代的解決方案?

回答

4

使用EDMX和設計師時,沒有替代的解決方案。 EDMX固定爲單一數據庫實施。在SQL Server的情況下,它更糟糕,因爲它在SQL Server 2005和2008方言中有所不同(我們預計2012年會有這種方式)。一旦使用EDMX,這種與數據庫實現的緊密耦合是SSDL(EDMX中的數據庫描述)的一部分。如果您還使用VS的默認EF設計器,則您無法完全控制SSDL - 當您從數據庫更新模型或從模型生成數據庫時,總會重新創建它。

目前的解決方案是:在發展和VS設計師

  • 使用SQL Server 2005將不會覆蓋您的供應商清單。此配置也應該在SQL Server 2008和2008 R2上運行。
  • 使用代碼第一(EF 4.1 - 4.3.1)在那裏,這是在運行時
  • 自動處理,而不是EDMX不要VS設計師使用,並手動維護EDMX或買一些更強大的設計師
  • 創建獨立的SSDL部分用於SQL Serve 2005和2008,並根據使用的數據庫實現在連接字符串中正確引用它們。這樣做有許多缺點,例如維護兩個幾乎相同的SSDL文檔,並且再次使用VS設計器。
+0

好,吸住。好吧。 +1&acc即使它是壞消息:) –