MetadataException: невозможно загрузить указанный ресурс метаданных

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

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

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

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

48 ответов

Решение

Это означает, что приложение не может загрузить EDMX. Есть несколько вещей, которые могут вызвать это.

  • Возможно, вы изменили свойство MetadataArtifactProcessing модели на "Копировать в выходной каталог".
  • Строка подключения может быть неправильной. Я знаю, что вы говорите, что не изменили его, но если вы изменили другие вещи (скажем, название сборки), это все равно может быть неправильно.
  • Возможно, вы используете задачу посткомпиляции для встраивания EDMX в сборку, которая по какой-то причине больше не работает.

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

Обновление: я написал сообщение в блоге с более полными шагами для устранения проблем.

Это небольшое изменение поможет с этой проблемой.

У меня есть решение с 3 проекта.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

изменить на

connectionString="metadata=res://*/;

Вы можете получить это исключение, когда Edmx находится в одном проекте, а вы используете его из другого.

Причина в Res://*/ это URI, который указывает на ресурсы в текущей сборке. Если Edm определен в сборке, отличной от кода, который его использует, res://*/ не будет работать, поскольку ресурс не найден.

Вместо указания '*' вам нужно указать полное имя сборки (включая токен открытого ключа). Например:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

Лучший способ создать строки подключения с EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

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

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

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

    return csBuilder.ToString();
}

Если вы все еще сталкиваетесь с исключением, откройте сборку в отражателе и проверьте имена файлов для ваших файлов.csdl, .ssdl и.msl. Когда ресурсы имеют имена, отличные от тех, которые указаны в значении метаданных, это не сработает.

У меня была похожая ошибка. Я воссоздал проект (длинная история) и извлек все из старого проекта. Я не осознавал, что моя модель раньше находилась в каталоге с именем "Модель", а теперь была в каталоге "Модели". Как только я изменил соединение в моем Web.Config из этого:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

к этому:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

Все заработало (поменял Model в Models). Обратите внимание, что мне пришлось изменить это три места в этой строке.

И быстрый способ проверить название модели без Reflector.... поищите каталог

...obj/{config output}/edmxResourcesToEmbed

и проверьте наличие файлов ресурсов.csdl, .msl и.ssdl. Если они находятся в подкаталоге, к имени подкаталога необходимо добавить имя модели.

Например, мои три файла ресурсов находятся в подкаталоге Data, поэтому моя строка подключения должна была быть

metadata = res: // * /Data.MyModel.csdl | res: // * /Data.MyModel.ssdl | res: // * /Data.MyModel.msl;

(против метаданных =res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;).

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

Нажмите-> Построить-> Чистое решение

Затем нажмите->Build-> Rebuild Solution

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

У меня также была эта проблема, и это было потому, что строка подключения в моем web.config немного отличалась от строки в app.config сборки, где находится мой EDMX. Не знаю, почему это изменилось, но вот две разные версии.

App.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Что исправило, так это просто скопировав строку app.config (обратите внимание на небольшую разницу в конце - вместо "App=EntityFramework"хотел"application name=EntityFramework") в web.config и проблема была решена.:)

Это произошло со мной, когда я случайно переключил действие по сборке файла edmx (отображается в разделе "Свойства" в среде IDE) с "EntityDeploy" на "None". EntityDeploy - это то, что заполняет метаданные для вас: см. http://msdn.microsoft.com/en-us/library/cc982037.aspx

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

metadata=res://*/Data.DataModel.csdl

... до...

metadata=res://*/DataModel.csdl

Иногда я вижу эту ошибку в моем проекте. Я решаю это

1 - Щелкните правой кнопкой мыши на файле EDMX

2 - Выбрать Run Custom Tool вариант

Я потратил целый день на эту ошибку

если вы работаете с n-tear architecture

или ты пытался separate Models создано EDMX Форма DataAccessLayer для DomainModelLayer

может быть, вы получите эту ошибку

  1. Первый шаг устранения неполадок - убедиться, что строка подключения в webconfig (UILayer) а также appconfig (DataAccessLayer) подобные
  2. Второе, что очень важно, connection string

    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
    

    в чем проблема

откуда я Model или что угодно.csdl в моей строке подключения, где они

вот я наше решение посмотри на картинку

надеюсь, что помощь вам

Я только что провел 30 минут с этим. Я переименовал объект entity, переименовал запись в файле конфигурации, но есть еще кое-что... вы также должны изменить ссылку на csdl

очень легко пропустить - если вы переименовываете, убедитесь, что вы получите все....

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

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

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

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

Мне удалось решить эту проблему в 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"

После нескольких часов поисков и поисков решений ни одно из предложенных решений не сработало. Я перечислил несколько решений здесь. Я также отметил тот, который работал для меня. (Я использовал 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

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

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

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

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

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

В моем случае эта проблема была связана с переименованием файла 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".

Моя проблема и решение, симптомы были такими же: "Невозможно загрузить указанный ресурс метаданных", но основная причина была другой. У меня было 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" />

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

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

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

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

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

ClassTypeThatResidesInEdmProject.Assembly.FullName 

повеселись.

Исключением является то, что компилятор указывает на несуществующие метаданные, поэтому просто скопируйте app.config строка подключения к Web.config ConnectionString

Имея ту же проблему, я заново создал EDMX из базы данных. Решает мою проблему.

Я написал этот вспомогательный класс для создания экземпляров объектов 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;
    }
}

Просто введите путь следующим образом вместо {Path.To.The.}: Res: // / averagePath.To.The.‹YourEdmxFileName.csdl|res:// / {Path.To.The.} YourEdmxFileName.ssdl | Рез://*/{Path.To.The.}YourEdmxFileName.msl

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

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

Тогда это работало просто отлично.

У меня были проблемы с этим же сообщением об ошибке. Моя проблема была решена путем закрытия и повторного открытия Visual Studio 2010.

Я просто не ссылался на свою библиотеку классов, которая содержала файл EDMX.

Что касается меня, я разделил уровень доступа к данным и уровень интерфейса пользователя. Таким образом, у меня есть строка подключения объекта для каждого слоя.

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

Unable to load the specified metadata resource

Поэтому я делаю одинаковые строки подключения для этих двух слоев (DAL, UI), он отлично работает.

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

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

Хотя решение было скомпилировано после того, как все * ссылки на проекты были добавлены по мере необходимости, ошибка возникла при запуске сайта.

EDMX находится в одном из проектов, который был перемещен (проект "Данные"), но, конечно, отсутствие ссылки на проект данных не привело к ошибке компиляции, просто к ошибке во время выполнения.

Простое добавление отсутствующей ссылки в основной проект решило эту проблему, и вообще не нужно редактировать соединение.

Я надеюсь, что это помогает кому-то еще.

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

Другие вопросы по тегам