Вопрос по entity-framework – MetadataException при использовании Entity Framework Entity Connection [дубликат]

64

This question already has an answer here:

MetadataException: Unable to load the specified metadata resource 43 answers

Этот код:

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 в рефлекторе, и метаданные выглядят хорошо.

Пожалуйста, пожалуйста, всегда публикуйте полное исключение, включая трассировку стека и внутренние исключения. Опубликовать результаты ex.ToString (). John Saunders
Я надеюсь, что вы не возражаете. Я отредактировал ваш вопрос, чтобы исправить формат. Вы должны сделать отступ с четырьмя пробелами для форматирования как кода. В противном случае выберите код и нажмите кнопку с 10101. John Saunders
Спасибо за чаевые Shiraz Bhaiji

Ваш Ответ

8   ответов
45

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

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

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

кудаext is "csdl", "ssdl" и "msl".

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

model name часть должна бытьname and namespace вашего файла .edmx относительно вашей сборки. Так что если у вас естьMy.DataAccess сборка и вы создаетеDataModels.edmx вModels папка, ее полное имяMy.DataAccess.Models.DataModels, В этом случае у вас будет «Models.DataModels. (Ext)». в ваших метаданных.

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

Похоже, "My.DataAccess." не требуется; только "Models.DataModels" часть (возможно, это работает относительно каждого искомого пространства имен корневого узла).
БЛАГОДАРЮ ВАС! В Интернете доступно 100 ответов, но это самое полезное дополнение к любому из них. Наглядный пример: вDalProject.dll у вас есть папкаClient который имеетClient.edmx файл в нем. Так вы тогда замените//*/Client.(csdl/ssdl/msl) с//DalProject/Client.Client.(csdl/ssdl/msl)
14

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

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

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

Сначалаxxx часть. Это не что иное, как имя сборки, в которой вы определили свои контекстные классы EF. Обычно это было бы что-то вродеMyProject.Data. Default value is * which stands for all loaded assemblies. It's always better to specify a particular assembly name.

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

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

res://MyProject.Data/Models.Catalog.DataContext.csdl|res://MyProject.Data/Models.Catalog.DataContext.ssdl|res://MyProject.Data/Models.Catalog.DataContext.msl;

Поиск в dll. Ultra Top Tip. Спасибо :)
0

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

110

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

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

Хотя у меня возникла проблема с опозитом, я не работал в модульном тесте, но работал в сервисе.

Мой "какой-то случай" был только с одним .edmx файлом в решении. Я понятия не имею, что случилось, но это было ужасно. ;)
& quot; Некоторые случаи & quot; когда у вас есть более одного файла EDMX с одинаковым именем (например, Model1).
Ссылка, которую вы дали, привела меня к ответу, так что вы получаете мой upvote! Я боролся с этим в течение половины дня. Я пробовал res: // NameOfDLL / ... но безуспешно. Тем не менее, я, наконец, заставил его работать с res: // NameOfAssembly / ... В этом случае они были одинаковыми, за исключением того, что в имени сборки не было .dll на конце.
Я голосую "за", потому что это решило мою проблему. Спасибо!
Я изменил пространство имен моей модели после того, как сгенерировал строку подключения, после того, как я исправил строку подключения в соответствии с вашей инструкцией, и она работала нормально.
0

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

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

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

0

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

0

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

0

.edmx База данных первой модели из одного проекта в другой.

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

Deleted the connection strings in the app.config or web.config Deleted the 'Model.edmx' Re-added the model to the project.

Похожие вопросы