MetadataException: невозможно загрузить указанный ресурс метаданных - PullRequest
647 голосов
/ 27 марта 2009

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

У кого-нибудь есть идеи?

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

Я пытался воссоздать EDMX. Я пытался воссоздать проект. Я даже пытался воссоздать базу данных с нуля. Не повезло вообще.

Ответы [ 43 ]

6 голосов
/ 02 октября 2010

В моем случае это решается изменением свойств файла edmx.

  1. Открыть файл edmx
  2. Щелкните правой кнопкой мыши в любом месте дизайнера EDMX
  3. выбрать недвижимость
  4. обновить свойство с именем «Обработка артефактов метаданных» до «Встроить в выходную сборку»

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

6 голосов
/ 25 июня 2018

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

Нажмите-> Построить-> Чистый раствор

Затем нажмите-> Построить-> Восстановить решение

Надеюсь, это поможет. Спасибо всем

5 голосов
/ 31 августа 2010

Мне удалось решить эту проблему в Visual Studio 2010, VB.net (ASP.NET) 4.0.

Во время работы мастера модели сущностей вы сможете увидеть строку соединения сущности. Оттуда вы можете скопировать и вставить в строку подключения.

Единственное, чего мне не хватало, это "App_Code". в строке соединений.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
4 голосов
/ 29 сентября 2014

Моя проблема и решение, симптомы были такими же: «Не удалось загрузить указанный ресурс метаданных», но основная причина была другой. У меня было 2 проекта в решении, один был EntityModel, а другой решение. Я фактически удалил и заново создал файл EDMX в EntityModel.

Решением было то, что мне пришлось вернуться в проект веб-приложения и добавить эту строку в файл конфигурации. Новая модель изменила несколько элементов, которые должны были дублироваться в файле Web.Config «другого» проекта. Старая конфигурация больше не была хорошей.

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />
4 голосов
/ 29 июля 2015

После нескольких часов поисков и поисков решений ни одно из предложенных решений не сработало. Я перечислил несколько решений здесь. Я также отметил тот, который работал для меня. (Я использовал EF версии 6.1.1 и SQL Server 2014 - но более старую БД)

  1. Перестройте проект и попробуйте снова.
  2. Закройте и откройте VS - я не знаю, как это работает
  3. убедитесь, что вы поместили файл .EDMX в каталог, убедитесь, что вы включили каталоги в вашу ConnectionString. например мой находится в папке DAL. ТАК это выглядит так: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl; (это файлы. Чтобы увидеть их, вы можете включить Показать все файлы в обозревателе решений в каталоге ~ / obj / ..)

... и многие другие, которые я пробовал [например: возврат версии EntityFramework к более поздней версии (не уверен в этом)]


что у меня сработало:

из этой статьи здесь , это помогло мне решить мою проблему. Я только что изменил свой ProviderManifestToken="2012" на ProviderManifestToken="2008" в файле EDMX. Для этого:

Обозреватель решений

  1. Щелкните правой кнопкой мыши файл .edmx
  2. Открыть с помощью ..
  3. Редактор XML
  4. Изменить ProviderManifestToken = "XXXX" на 2008

Надеюсь, это поможет.

4 голосов
/ 20 апреля 2009

Окончательное решение (даже после воссоздания базы данных на двух других машинах, а также EDMX и других приложений) заключалось в том, чтобы не использовать первую версию Entity Framework. С нетерпением жду возможности оценить его снова в .NET 4.0.

После повторения той же проблемы снова и поиска ответов, я наконец нашел того, у кого была такая же проблема. Похоже, что строка подключения не была правильно сгенерирована мастером Visual Studio, а в ссылке на ресурсы метаданных пропущен важный путь.

v1.0 BUG ?: Невозможно загрузить указанный ресурс метаданных. Скрипты! = Модели

Обновление 2013-01-16 : После почти полного использования практики EF Code First (даже с существующими базами данных) эта проблема больше не является проблемой. Для меня это было жизнеспособным решением - избавиться от беспорядка, создаваемого автоматически сгенерированным кодом и конфигурацией, и повысить собственный контроль над продуктом.

3 голосов
/ 23 июня 2010

В моем случае эта проблема была связана с переименованием файла edmx моей модели ... исправление строки подключения app.config для файлов csdl / ssdl / msl устранило мою проблему.

Если вы используете конструктор EF 4.0 для генерации вашего csdl / ssdl / msl, эти 3 «файла» фактически будут храниться в основном файле edmx модели. В этом случае пост Вакаса в значительной степени находится на отметке. Важно понимать, что «Model_Name» в его примере нужно будет изменить на любое текущее имя файла .edmx вашей модели (без .edmx).

Кроме того, если ваш файл edmx не находится на корневом уровне вашего проекта, вам необходимо предвосхитить Model_Name с указанием относительного пути, например,

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

будет означать, что xsdl / ssdl / msl xml хранится в файле модели «WidgetModel.edmx», который хранится в папке с именем «MyModel».

3 голосов
/ 08 августа 2010

Для всех вас SelftrackingEntities пользователей, если вы выполнили Microsoft Walk-through и разделили класс контекста Object на проект службы wcf (путем ссылки на контекст .tt), поэтому этот ответ для вас:

часть показанных ответов в этом посте, включающая код вроде:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

НЕ РАБОТАЕТ ДЛЯ ВАС !! причина в том, что YourObjectContextType.Assembly теперь находится в другом Assembley (внутри сборки проекта wcf),

Таким образом, вы должны заменить YourObjectContextType.Assembly.FullName на ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

веселись.

3 голосов
/ 06 июля 2010

Я написал этот вспомогательный класс для создания экземпляров объектов ObjectContext, когда они определены в проекте, отличном от проекта, использующего его. Я анализирую строку подключения в файле конфигурации и заменяю '*' на полное имя сборки.

Он не идеален, потому что он использует отражение для построения объекта, но это самый общий способ сделать это, который я мог найти.

Надеюсь, это кому-нибудь поможет.

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}
2 голосов
/ 29 марта 2012

Была такая же проблема, потому что я переименовал сборку.

Мне также пришлось переименовать его в атрибутах AssemblyTitle и AssemblyProduct в проекте Properties / AssemblyInfo.cs, а также удалить и повторно добавить ссылку на файл edmx.

Тогда все заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...