Исключение MetadataException при использовании Entity Framework Entity Connection

Этот код:

using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities"))
{
  conn.Open();
}

Дает мне следующую ошибку:

Test method ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod threw exception:  System.Data.MetadataException: Unable to load the specified metadata resource..

Со следующей трассировкой стека:

System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.EntityClient.EntityConnection.SplitPaths(String paths)
System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections)
System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure)
System.Data.EntityClient.EntityConnection.Open()
ELS.Service.Business.Base.ServiceBase.StartLogging(String userWindowsLogon) in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business\Base\ServiceBase.cs: line 98
ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod() in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business.IntegrationTest\Base\ServiceBaseIntegrationTest.cs: line 65

Однако этот код использует ту же строку соединения:

using (ELSCommonEntities db = new ELSCommonEntities())
{
    var res = from c in db.Logging
              select c;

    int i = res.Count();
}

Не дает ошибку.

Строка подключения:

<add name="ELSCommonEntities" connectionString="metadata=res://*/Common.CommonModel.csdl|res://*/Common.CommonModel.ssdl|res://*/Common.CommonModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=els5_demo;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Я также открыл DLL в отражателе, и метаданные выглядят нормально.

Ответ 1

Нашел проблему.

Стандартная строка метаданных выглядит следующим образом:

metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl

И это прекрасно работает в большинстве случаев. Однако в некоторых (включая мои) Entity Framework запутаться и не знает, в какую DLL искать. Поэтому измените строку метаданных на:

metadata=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl

И это сработает. Именно эта ссылка привела меня на правильный путь:

http://itstu.blogspot.com/2008/07/to-load-specified-metadata-resource.html

Хотя у меня была проблема с oposite, не работал в unit test, но работал в сервисе.

Ответ 2

У меня было такое же сообщение об ошибке, и проблема была также частью метаданных строки подключения, но мне пришлось копать немного глубже, чтобы решить ее и захотела поделиться этим маленьким саморозом:

Строка метаданных состоит из трех разделов, каждая из которых выглядит так:

res://
      (assembly)/
      (model name).(ext)

Где ext - "csdl", "ssdl" и "msl".

Для большинства людей сборка может быть, вероятно, "*", что, по-видимому, указывает на то, что будут загружены все загруженные сборки (я не проделал огромных испытаний). Эта часть не была проблемой для меня, поэтому я не могу прокомментировать, нужно ли вам имя сборки или имя файла (т.е. С или без ".dll" ), хотя я видел оба предложения.

Часть имени модели должна содержать имя и пространство имен вашего .edmx файла относительно вашей сборки. Поэтому, если у вас есть сборка My.DataAccess и вы создаете DataModels.edmx в папке Models, ее полное имя - My.DataAccess.Models.DataModels. В этом случае у вас есть "Models.DataModels. (Ext)" в ваших метаданных.

Если вы когда-либо перемещаете или переименовываете свой .edmx файл, вам нужно будет вручную обновить строку метаданных (по моему опыту), и помните, что для изменения относительного пространства имен сохраняются несколько головных болей.

Ответ 3

Существует несколько возможных уловов. Я думаю, что наиболее распространенная ошибка в этой части строки подключения:

Рез://xxx/yyy.csdl | Рез://xxx/yyy.ssdl | разрешение://xxx/yyy.msl;

Это не волшебство. Как только вы поймете, что означает, вы получите строку соединения правильно.

Сначала часть xxx. Это не что иное, как имя сборки, где вы определили контексты контекста EF. Обычно это будет что-то вроде MyProject.Data. Значение по умолчанию - *, которое обозначает все загруженные сборки. Всегда лучше указывать конкретное имя сборки.

Теперь часть yyy. Это имя ресурса в сборке xxx. Обычно это будет относительный путь к вашему .edmx файлу с точками вместо косой черты. Например. Модели/Каталог - Models.Catalog Самый простой способ получить правильную строку для вашего приложения - построить сборку xxx. Затем откройте сборку dll файла в текстовом редакторе (я предпочитаю просмотрщик Total Commander по умолчанию) и поиск ".csdl". Обычно в этой строке не должно быть больше 1.

Ваша последняя строка соединения EF может выглядеть так:

Рез://MyProject.Data/Models.Catalog.DataContext.csdl | разрешение://MyProject.Data/Models.Catalog.DataContext.ssdl | Рез://MyProject.Data/Models.Catalog.DataContext.msl;

Ответ 4

Как ответил Шираз Бхайдэ, это метаданные = res:///Model.csdl | res:///Model.ssdl | res://*/Model.msl.  Однако у меня все еще были проблемы с построением правильной строки, основанной на моей локализации модели, пространствах имен и имени сборки. Очень простым решением было переименовать файл .edmx в Visual Studio (после переименования и вернуться к исходному имени), что вызвало автоматическое обновление строки в моем Web.config

Ответ 5

У меня была та же проблема с тремя проектами в одном решении, и все предложения не работали, пока я не сделал ссылку в файле ссылки проекта веб-сайта на проект, где находится файл edmx.

Ответ 6

Я переместил первую базу данных DataModel в другой проект на полпути через разработку. Плохое планирование (или отсутствие там) с моей стороны.

Первоначально у меня было решение с одним проектом. Затем я добавил еще один проект в решение и воссоздал первую базу данных DataModel из Sql Server Dataase.

Чтобы устранить проблему - Исключение MetadataException при использовании Entity Framework Entity Connection. Я скопировал свой ConnectionString из нового Project Web.Config в исходный проект Web.Config. Однако это произошло после того, как я обновил все ссылки в исходном проекте до нового проекта DataModel.

Ответ 7

Это может быть просто ошибка строки соединения, которая решается вышеуказанным процессом, но если вы используете DLL в нескольких проектах, то убедитесь, что строка соединения названа правильно, наверняка исправит ошибку.

Ответ 8

У меня возникла эта проблема при перемещении моей первой модели базы данных .edmx из одного проекта в другой.

Я просто сделал следующее:

  • Удалены строки подключения в app.config или web.config
  • Удалено 'Model.edmx'
  • Повторно добавила модель в проект.