Не удалось разрешить сборку Model.dll

У меня был проект библиотеки классов, который использовал Entity Framework, и он работал нормально, пока я не переместил модель в отдельный проект типа библиотеки классов.

После того, как я переместил модель в отдельный проект библиотеки классов под названием "Модель", я изменил строку подключения в 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: 

Я попробовал сценарий с двумя клиентами, а именно консольным приложением и MVC-приложением.

Хотя консольное приложение даже не копирует BusinessObjects.dll и связанные с ним Model.dll, а именно Model.dll в каталог bin приложения консоли, приложение MVC. Тем не менее, оба из них, кажется, не найти Model.dll сборки на всех, и поднять вышеупомянутый FileNotFoundException.

Ответ 1

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. Если нет, измените строку подключения и/или имя сборки соответственно.

Ответ 2

Я думаю, проблема связана с EF ConStr. Обычно, когда вы хотите использовать встроенный ресурс, вы должны установить Metadata следующим образом:

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

Вы также можете использовать * wildcard вместо <assemblyFullName>. Это заставляет искать следующие места для файла во время выполнения:

  • Вызывающая сборка.
  • Связанные сборки.
  • Сборки в каталоге bin приложения.

Больше информации здесь

Ответ 3

Я переместил 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" />

(Структура каталогов выполняется с . (Dot) not / (slash)), например, после res:///Ecom.Ecom.csdl (от res:///Ecom.csdl, а не в его собственной папке).