Ошибка MetadataException: Unable to load the specified metadata resource в Entity Framework
Причина ошибки
Ошибка MetadataException возникает, когда Entity Framework не может найти файлы метаданных (.csdl, .ssdl, .msl) по указанному пути в строке подключения. Чаще всего это происходит из-за неправильного формата ресурса res://*/ или из-за того, что файлы .edmx не включены в сборку как встроенные ресурсы (Embedded Resource).
Решение: правильный формат строки подключения
В подходе Database First файлы метаданных хранятся внутри сборки как встроенные ресурсы. Строка подключения должна указывать на них в формате:
metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl
Но здесь есть нюанс: символ * означает «любая сборка в домене приложения». Если ваша модель находится в другой сборке (например, в отдельной библиотеке классов), нужно указать полное имя сборки вместо звёздочки. Однако чаще проблема в другом — файлы .edmx генерируются с неправильным именем ресурса.
Как проверить и исправить
- Убедитесь, что файлы .edmx компилируются как встроенный ресурс: щёлкните правой кнопкой по файлу .edmx в Solution Explorer → Properties → Build Action = "Embedded Resource".
- Проверьте реальное имя ресурса: откройте .edmx файл в текстовом редакторе (например, Notepad++). В начале файла вы увидите что-то вроде:
Обратите внимание на атрибут<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="2.0"> <edmx:Runtime> <edmx:ConceptualModels> <Schema Namespace="MyModel" ...>Namespace— это часть имени ресурса. Фактическое имя ресурса будет:YourAssemblyName.MyModel.csdl(и аналогично для .ssdl и .msl). - Исправьте строку подключения: вместо
res://*/используйте полный путь к сборке. Например, если ваша сборка называетсяMyApp.exeилиMyLibrary.dll, напишите:
Или, чтобы быть уверенным на 100%, используйте полное имя сборки (включая версию и культуру):metadata=res://MyApp/MyModel.csdl|res://MyApp/MyModel.ssdl|res://MyApp/MyModel.mslmetadata=res://MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/MyModel.csdl|... - Альтернативный простой способ: замените
res://*/наres://YourAssemblyName/. Например, если ваша сборка называетсяDataLayer, то строка будет:metadata=res://DataLayer/MyModel.csdl|res://DataLayer/MyModel.ssdl|res://DataLayer/MyModel.msl
Проверка с помощью утилиты
Вы можете использовать встроенную утилиту EdmGen.exe (из папки SDK) для просмотра всех ресурсов в сборке:
EdmGen.exe /ViewGenSchemas "YourAssembly.dll"
Она покажет точные имена ресурсов, которые нужно указать в строке подключения.
Итоговый рабочий пример
Если ваша сборка называется MyApp.exe, строка подключения должна выглядеть так:
<connectionStrings>
<add name="MyEntities"
connectionString="metadata=res://MyApp/MyModel.csdl|res://MyApp/MyModel.ssdl|res://MyApp/MyModel.msl;
provider=System.Data.SqlClient;
provider connection string='data source=localhost;initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework'"
providerName="System.Data.EntityClient" />
</connectionStrings>
После этого пересоберите проект и запустите — ошибка должна исчезнуть.
<<Альтернативное решение: использование Code First вместо Database First
Если вы не хотите возиться с метаданными и строками подключения, рассмотрите переход на Code First подход. В этом случае вы сами пишете классы сущностей и контекст, а Entity Framework сам создаёт БД (или маппится на существующую).
Пример:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class MyContext : DbContext
{
public DbSet<User> Users { get; set; }
public MyContext() : base("name=MyConnectionString") { }
}
В строке подключения уже не нужно указывать метаданные — просто обычная строка для SQL Server:
<add name="MyConnectionString"
connectionString="data source=localhost;initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
Этот подход проще, не требует .edmx файлов и решает проблему с MetadataException раз и навсегда. Если у вас уже есть БД, используйте Entity Framework Power Tools для генерации классов Code First из существующей схемы.
Недостаток: вы теряете визуальный редактор модели, но для небольших проектов это не критично.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги
Топ ошибок начинающих Swift разработчиков и как их избежать