2009-06-11 162 views
15

我們有一個由兩個項目組成的解決方案 - 控制檯應用程序項目和Web應用程序項目。它們中的每一個在模式中都是相同的,但是用不同的名稱.edmx文件來訪問同一個數據庫。實體框架錯誤 - 「EntityContainer名稱必須是唯一的」

控制檯應用程序作爲計劃任務在託管Web應用程序的同一臺服務器上運行。 Web應用程序包含對控制檯應用程序的引用,因爲Web應用程序中的某些操作會導致調用控制檯應用程序中的方法。 這個組合已經在我們的登臺環境中成功運行了好幾個月。

當發佈現場,我們看到了以下錯誤消息,每天至少一次:指定

模式是無效的。錯誤:

ProjectName.csdl(3,4):錯誤0019:EntityContainer名稱必須是 唯一。名稱爲「ProjectEntities」的EntityContainer已定義爲 。 ProjectName.csdl(63,4):錯誤0019: 架構中的每個類型名稱必須是唯一的。類型名稱'ProjectModel.DataSource'已經定義爲 。 ProjectName.csdl(75,4):錯誤0019: 架構中的每個類型名稱必須是唯一的。類型名稱'ProjectModel.Error'已定義爲 。

這繼續,列出我們的模式中的所有類型名稱。

可以通過回收應用程序池或重新啓動IIS來解決此錯誤。

請注意,直到Web應用程序運行一段時間後纔會發生錯誤 - 當我們編譯或第一次訪問應用程序時,不會發生此錯誤。

我最初的理論是,兩個實體容器互相沖突,因爲Web應用程序引用了控制檯應用程序,但它們有不同的名稱,這會導致錯誤「EntityContainer名稱必須是唯一的,一個名稱爲EntityContainer 'ProjectEntities'已經被定義爲「令人困惑。

+0

檢查此鏈接[1]:http://stackoverflow.com/questions/4898794/the-entitycontainer-name-must-be-unique-in-different-assemblies,這適用於我。我希望能幫到你! – 2015-07-02 00:46:02

回答

15

在過去遇到這個問題時,我總是創建第三個共享庫,其中包含實體模型 - 這樣,如果您決定添加新表,那麼您知道不會出現名稱衝突/列/方法你只需要這樣做一次,等等等等。

+0

這是我們採取的解決問題的方法。 – ENX 2009-06-11 12:37:41

+0

@ENX也許你可以把它標記爲答案。 – icelava 2011-03-17 08:18:17

+0

@icelava - @ ENX的一年半以來一直沒有被看到:(你總是可以通過投票來強化答案;) – 2011-03-17 09:12:51

2

當單個DLL或類庫項目中有多個實體model.edmx文件時,會發生此錯誤。儘管我不知道錯誤背後的原因,但可以通過刪除其他模型或將其他model.edmx文件移動到另一個類庫來解決此問題。

而且不要忘記刪除以前的dll的引用

2

嗯,在我的情況,我的工作diferent軟件架構,因爲我有diferent項目(DLL)中,他們訪問同一個數據庫,但我裏面有不同的實體。所以,當我在需要全部或至少兩個的項目中引用時,我得到這個錯誤

如果我更改每個實體容器名稱,我解決了這個問題,但現在我的連接字符串是不同的並且我必須在配置文件中爲每個我引用的dll包含所有連接字符串。

24

轉到該bin文件夾並手動刪除dll和pdb文件。

0

注意,當試圖將實體容器重命名爲以前刪除的實體容器時,您需要進入web.config或app.config並從配置部分刪除連接字符串。

3

爲了防止其他人絕望而且找不到任何答案 - 我不小心以第二個位置的項目中包含的.edmx文件的副本結束。兩者都被包含在構建中。

;-)

如果這發生在你身上,不要害怕,你是不是第一次。

0

我的Bin文件夾被隱藏了,所以不得不顯示隱藏文件,刪除舊的dll/pdb,並在項目中包含我需要的文件。重建,工作。

5

變化從這個

metadata=res://*/App_Code.AAA.csdl|res://*/App_Code.AAA.ssdl|res://*/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 

的webconfig文件實體連接字符串項

metadata=res://MyProject/App_Code.AAA.csdl|res://MyProject/App_Code.AAA.ssdl|res://MyProject/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 
0

我的EntityFramework 6.0通過修復了這個問題。

  1. 在創建模型的過程中,我將.edmx命名爲實體的名稱。即(MYDbEntities)

  2. 創建後,我打開MYDbEntities.Context.cs並將「實體」類修改爲「MYDbEntities」。

  3. 打開App.Config並查找連接字符串
  4. 打開MYDbEntities.Context.cs並將連接字符串從配置更改爲連接字符串。例如, 「MyDbConnection」
  5. 確保連接字符串是這樣

    元= RES:// /MYDbEntities.csdl|res:// /MYDbEntities.ssdl|res://*/MYDbEntities .msl; provider = System.Data.SqlClient; provider connection string = " data source = .; initial catalog = YourDb; persist security info = True; user id = sa; password = Sw0rdf!sh; multipleactiveresultsets = True; application name = EntityFramework "

注意:我的實體駐留在單獨的DLL中。

希望這會有所幫助。

相關問題