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="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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
может быть, вы получите эту ошибку
- Первый шаг устранения неполадок - убедиться, что строка подключения в
webconfig (UILayer)
а такжеappconfig (DataAccessLayer)
подобные Второе, что очень важно,
connection string
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
в чем проблема
откуда я Model
или что угодно.csdl в моей строке подключения, где они
вот я наше решение посмотри на картинку
надеюсь, что помощь вам
Я только что провел 30 минут с этим. Я переименовал объект entity, переименовал запись в файле конфигурации, но есть еще кое-что... вы также должны изменить ссылку на csdl
очень легко пропустить - если вы переименовываете, убедитесь, что вы получите все....
Для моего случая это решается изменением свойств файла edmx.
- Откройте файл EDMX
- Щелкните правой кнопкой мыши в любом месте дизайнера EDMX
- выбрать недвижимость
- обновить свойство с именем "Обработка артефактов метаданных" до "Встроить в выходную сборку"
это решило проблему для меня. Проблема в том, что когда контейнер пытается найти метаданные, он не может его найти. так просто сделайте это в той же сборке. это решение не будет работать, если ваши файлы 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 - но более старую БД)
- Восстановите проект и попробуйте снова.
- Закройте и откройте VS - я не знаю, как это работает
- убедитесь, что вы поместили файл.EDMX в каталог, убедитесь, что вы включили каталоги в вашу ConnectionString. например мой находится в папке DAL. ТАК это выглядит так:
connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;
(это файлы. чтобы увидеть их, вы можете переключить Показать все файлы в обозревателе решений в каталоге ~/obj/..)
... и многие другие, которые я пробовал [например: возврат версии EntityFramework к более поздней версии (не уверен в этом)]
что сработало для меня:
из этой статьи, это помогло мне решить мою проблему. Я просто поменяла ProviderManifestToken="2012"
в ProviderManifestToken="2008"
в файле EDMX. Сделать это:
Обозреватель решений
- Щелкните правой кнопкой мыши по файлу.edmx
- Открыть с..
- Редактор XML
- Изменить 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="
data source=Q\DEV15;initial catalog=whatever;
user id=myuserid;password=mypassword;
multipleactiveresultsets=True;
application name=EntityFramework""
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 в трех местах, чтобы включить различные имена подкаталогов: