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-TOMELS-RELEASE1ELS.Service.BusinessBaseServiceBase.cs: line 98
ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod() in C:C-TOMELS-RELEASE1ELS.Service.Business.IntegrationTestBaseServiceBaseIntegrationTest.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 в отражателе, и метаданные выглядят нормально.

8 63

8 ответов:

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

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

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, не работал в модульном тесте, но работал в сервисе.

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

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

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

здесь ext это "csdl", "ssdl"и " msl".

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

на название модели часть должна быть имя и пространство имен вашего .файл edmx, относительно вашей сборки. Так что если у вас есть мой.Доступа к данным сборка и создании DataModels.edmx на модели папка, ее полное имя мой.Доступа к данным.Модели.DataModels. В этом случае у вас были бы "модели.Модели данных.(ВН)" в метаданных.

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

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

res: / / xxx / yyy.csdl / res:/ / xxx / yyy.ssdl / res:/ / xxx / yyy.msl;

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

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

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

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

res://MyProject.модель данных.Каталог.свойство DataContext.csdl/res:/ / MyProject.модель данных.Каталог.свойство DataContext.ssdl / res://MyProject.модель данных.Каталог.свойство DataContext.msl;

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

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

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

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

решить проблему - MetadataException при использовании Entity Framework Entity Connection. Я скопировал мой ConnectionString из нового проекта Web.Конфигурации на Web.Конфигурации. Однако это произошло после того, как я обновил все ссылки в исходном проекте до new DataModel.

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

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

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

  1. удалил строки подключения в app.config или web.config
  2. удалил модель.edmx'
  3. повторно добавил модель в проект.