2013-07-21 17 views
13

我有一個類庫項目,使用實體框架,它工作正常,直到我將模型移出一個單獨的類庫類型的項目。無法解決大會Model.dll

後,我搬到了模型出來叫模型一個單獨的類庫項目,我在app/web.config中改變了連接字符串如下:

<add name="GlobalizationEntities" 
connectionString="metadata=res://Model.dll/Models.ResourceGlobalizationModel.csdl| 
res://Model.dll/Models.ResourceGlobalizationModel.ssdl| 
res://Model.dll/Models.ResourceGlobalizationModel.msl; 
provider=System.Data.SqlClient; 
provider connection string=&quot; 
Data Source=MyComputer\sqlexpress; 
Initial Catalog=DaDatabase; 
Integrated Security=true; 
MultipleActiveResultSets=True&quot;" 
providerName="System.Data.EntityClient" /> 

(我已經包含換行符。在上述的目的片段用來提高可讀性我的代碼沒有這些換行符)

現在,我的解決方案的結構是這樣的:

enter image description here

不過,我會在運行時一個FileNotFound例外,上面寫着:

System.IO.FileNotFoundException was unhandled by user code 
    HResult=-2147024894 
    Message=Unable to resolve assembly 'Model.dll'. 
    Source=System.Data.Entity 
    StackTrace: 
     at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.ResolveAssemblyName(String assemblyName, MetadataArtifactAssemblyResolver resolver) 
     at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
     at System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
     at System.Data.Metadata.Edm.MetadataCache.SplitPaths(String paths) 
     at System.Data.Common.Utils.Memoizer`2.<>c__DisplayClass2.<Evaluate>b__0() 
     at System.Data.Common.Utils.Memoizer`2.Result.GetValue() 
     at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg) 
     at System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) 
     at System.Data.Objects.ObjectContext.RetrieveMetadataWorkspaceFromConnection() 
     at System.Data.Objects.ObjectContext..ctor(EntityConnection connection, Boolean isConnectionConstructor) 
     at System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName) 
     at Resources.BaseServices.Globalization.Models.ResourceGlobalizationEntities..ctor() in C:\SVN\Model\ResourceGlobalizationEntities.cs:line 7 
     at Resources.BaseServices.Globalization.Models.Culture.IsValidCulture(String shortName) in C:\SVN\Model\Culture.cs:line 24 
     at Resources.BaseServices.Globalization.EntityFrameworkStringResourceLoader.set_CultureName(String value) in C:\SVN\BusinessObjects\EntityFrameworkStringResourceLoader.cs:line 129 
     at Resources.BaseServices.Globalization.EntityFrameworkStringResourceLoader..ctor(String cultureName, IDataSource dataSource) in C:\SVN\BusinessObjects\EntityFrameworkStringResourceLoader.cs:line 19 
    InnerException: 

我嘗試了情景2級的客戶端,即,一個控制檯應用程序和MVC應用程序。

雖然控制檯應用程序甚至不復制BusinessObjects.dll及其中引用的DLL,即Model.dll到控制檯應用程序的bin目錄,MVC應用程序一樣。然而,他們兩個似乎根本找不到Model.dll組件,並且提出了上述FileNotFoundException

+2

您是否檢查過每個項目的平臺(AnyCPU,x86)和目標框架? –

+0

謝謝。是的,我做到了。 –

+1

使用Fuslogvw.exe解決程序集解析問題。它的跟蹤顯示你在哪裏查找文件。 –

回答

1

我認爲問題來自EF ConStr。通常,當你想使用一個嵌入的資源,你應該設置Metadata類似如下:

Metadata=res://<assemblyFullName>/<resourceName>. 

您還可以使用通配符*代替<assemblyFullName>。它會導致在運行時搜索以下位置的文件:

  • 調用程序集。
  • 引用的程序集。
  • 應用程序的bin目錄中的程序集。

更多信息是here

+0

謝謝。如果你仔細看問題,那就是我已經做的。 –

+0

但是你沒有設置程序集......!正確的格式是'metadata = res:// /Model.dll'。我錯了嗎?! – AminSaghi

+0

實體框架委託程序集查找.NET框架中可用的默認程序集解析器,該框架是反射API的一部分。你可以給它全名或名字。 –

6

1)在連接字符串中的所有地方更改res://Model.dll/res://Model/(沒有的.dll擴展名)。您還可以指定程序集的完整名稱,例如:res://Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/(更多信息,請參閱:https://msdn.microsoft.com/en-us/library/cc716756.aspx)。

2)接下來,確保以下命名空間有效:Model.Models.ResourceGlobalizationModel。如果不是,請相應地更改連接字符串和/或程序集名稱。

0

我已將Ecom.edfx EF模型移至其自己的文件夾(Ecom)。
入住Web.config /(app.config)如果產生EF的連接字符串有它的元數據設置像以下水庫以下

<add name="EcomEntities" connectionString="metadata=res://*/Ecom.Ecom.csdl|res://*/Ecom.Ecom.ssdl|res://*/Ecom.Ecom.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;data source=****&quot;" providerName="System.Data.EntityClient" /> 

(目錄結構與.(點完成)不/(斜槓)):// /Ecom.Ecom.csdl(來自res:// /Ecom.csdl,而不在它自己的文件夾中)。