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

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

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

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

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

Ответы [ 43 ]

813 голосов
/ 27 марта 2009

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

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

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

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

344 голосов
/ 16 июля 2009

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

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

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

изменить на

connectionString="metadata=res://*/;
112 голосов
/ 19 февраля 2010

Вы можете получить это исключение, когда 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. Когда ресурсы имеют имена, отличные от тех, которые указаны в значении метаданных, это не сработает.

60 голосов
/ 04 декабря 2009

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

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

к этому:

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

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

25 голосов
/ 13 ноября 2013

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

... obj / {config output} / edmxResourcesToEmbed

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

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

метаданных = Рез: //*/Data.MyModel.csdl | Рез: //*/Data.MyModel.ssdl | Рез: // * / Данные .MyModel.msl;

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

15 голосов
/ 27 ноября 2012

У меня также была эта проблема, и это было потому, что строка подключения в моем 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, и проблема была решена. :)

12 голосов
/ 17 декабря 2009

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

8 голосов
/ 12 января 2010

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

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

6 голосов
/ 12 октября 2009

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

6 голосов
/ 21 августа 2016

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

если вы работаете с 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 в строке подключения, где они

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

enter image description here

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

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