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

681

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

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

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

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

Дж. Стин
источник
14
Если вопрос SO о конкретном продукте, который имеет более 200 тыс. Просмотров, значит, продукт работает не так, как ожидают пользователи. Я хотел бы видеть адрес Microsoft в этом. Вот ссылка, чтобы дать им предложения, если у вас есть время: visualstudio.uservoice.com/forums/121579-visual-studio .
Тони Л.
Моя проблема решена путем замены строки подключения, скопированной из проекта db-layer.
Хардик

Ответы:

857

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

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

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

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

Крейг Штунц
источник
70
Строка подключения, несмотря на мои попытки сравнить ее с утилитой сравнения контента в прошлый раз, была неверной.
Дж. Стин
16
Это было связующее звено для меня тоже. Если у вас есть Интеграционные тесты, которые также требуют подключения в своем собственном App.config, то при обновлении edmx все может не синхронизироваться.
Рэй
11
ОК, я исправил это, просто установив «Вставить»; компилируя, затем сбрасывая его на другой. Это решило мою проблему.
Shimmy Weitzhandler
6
Имел ту же проблему, попробовал ваше решение, хотел дать +1, понял, что я уже делал это в прошлом. Я даже не помню, чтобы у меня была эта проблема раньше;). На этот раз в моем случае это была правильная строка подключения в библиотеке классов с edmx и неправильная в веб-приложении, когда она использовалась.
Episodex
9
Потрясающий гид. Для меня я скопировал другую строку подключения, которая использовала res: // * / Database.MyModel2 ..., когда я ДЕЙСТВИТЕЛЬНО хотел res: // * / MyModel1 ... (База данных - это папка внутри моего проекта Integration Tests)
Emragins
361

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

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

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

изменить на

connectionString="metadata=res://*/;
MicTech
источник
11
Это исправило это для меня, но что, черт возьми, это значит?
Ланс Фишер
18
@Lance: Я подробно объясняю это в этой записи блога
Крейг Штунц
4
@jocull: нет, во многих случаях это не сработает, а в других будет медленным. Прочитайте мой пост в блоге, чтобы понять, почему.
Крейг Штунц
6
Переместил мой .edmx в папку Model и забыл обновить строку подключения. Отличный указатель. Спасибо. Мне потребовались бы часы, чтобы понять.
Убийство
11
Вы, сэр, спасли бедного сотрудника Microsoft от очень разозленного потребителя.
The Muffin Man
115

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

user276695
источник
8
Учтите, что «YourEdmxFileName» должно быть полным именем, например «YourNamespace.YourEdmxFileName», если вы используете пространства имен в вашей сборке. Однако вы должны удалить ту часть пространства имен, которая соответствует имени вашей сборки.
Марсель
5
MSDN говорит, что второй абзац неправильный. «Когда вы используете подстановочный знак (*), Entity Framework должен просматривать все сборки на наличие ресурсов с правильным именем».
Крейг Стунц
Я почти уверен, что пространство имен не имеет значения, но путь к встроенному файлу. Поэтому, даже если вы проверяете файл * .Designer.cs в соответствующем файле edmx и замечаете, что автоматически сгенерированное пространство имен класса - MyCompany ... что угодно, это не то, что вы должны использовать. Вместо этого путь - имя сборки, имена папок / решений / имя файла. Например: "metadata = res: // * / EntityModels. <Имя файла> .csdl |" + "res: // * / EntityModels. <имя файла> .ssdl |" + "res: // * / EntityModels. <имя файла> .msl;"
Даниэль
1
@Daniel, это в основном правильно, но учтите, что пространство имен и путь к внедренному файлу иногда совпадают. Вы должны посмотреть с Reflector (или бесплатной альтернативой этому), чтобы быть уверенным.
Крейг Штунц
похоже, что он работает, используя только имя сборки, без версии, publickeytoken и т. д. Как:res://MyAssembly/folder.<filename>.csdl...
Иван Феррер Вилла
67

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

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

к этому:

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

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

Рик Артур
источник
2
Я переместил свою модель Entity Framework из модели в DAL. Но потом, когда я написал тест (неделю спустя) в тестовом проекте для тестирования предиката Linq. Я получил эту ошибку. Я исправил тестовые проекты App.config так, как это выглядело в основном проекте web.config - как вы сказали в трех местах. Итак, ваш простой ответ помог мне справиться с задачей.
Патрик Линдстрем
Да, спасибо - проверьте ваше имя файла (ов). Как-то у меня было старое имя.
PeterX
7
Есть ли разница между двумя?
Эрвин Ройяккерс
2
@ErwinRooijakkers Модель против ModelS
Марк
Выяснил, что я сделал то же самое после прочтения блога Крейга, но +1 для изучения важно помнить, что изменения, внесенные в вашу библиотеку классов "entity", не вносятся автоматически в конфигурационные файлы проектов, которые на нее ссылаются. вздох рад, что я не одинок.
ruffin
26

И быстрый способ проверить название модели без 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;).

leqid
источник
Это была именно моя проблема. Потерял несколько часов на этом. Огромное спасибо за это простое объяснение
Фернандо Карвальоса
Отличный ответ, на самом деле объясняет, как найти вашу строку. И показывает, что подпапки имеют «.» в качестве разделителей, а не «\» или «/».
cjb110
16

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

Ghlouw
источник
1
Спасибо, это действительно была моя проблема. У меня был 1 проект, который обращается к БД с EF и другой проект WCF. После изменения имени первого проекта, connectionString была изменена в App.config моего первого проекта. Поэтому мне пришлось изменить connectionString в проекте WCF, а также в web.config :)
Volkan
Из документации MSDN о docs.microsoft.com/en-us/dotnet/framework/data/adonet/… : The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.строки подключения Entity Framework не обладают такой гибкостью, поэтому вы должны использовать только те ключевые слова, которые ожидаются.
Suncat2000
13

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

hgcummings
источник
Это было мое исправление - я переименовал свой edmx в .old, когда я копировал его, и пытался несколько вещей, после чего, когда я переименовал его обратно, Build Action установил для себя значение none и, таким образом, получил эту ошибку, установив ее обратно в EntityDeploy. мой выпуск :)
eth0
Я переместил свой файл EDMX в другую папку, и мне пришлось изменить действие сборки, чтобы также обновлять имена встроенных ресурсов. Спасибо!
Дэвид
Это было решением для меня; Я потерял этот параметр в процессе обновления до .NET Standard. Спасибо за спасение моего здравомыслия!
NetherGranite
11

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

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

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

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

Liakat
источник
8

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

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

TobyEvans
источник
6

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

Pitming
источник
6

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

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

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

user464507
источник
+1 000 000 это было основной проблемой для меня сегодня. Боли реорганизации пространств имен продуктов и объединения сборок.
Майк
6

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

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

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

введите описание изображения здесь

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

Башир Аль-Момани
источник
5

Мне удалось решить эту проблему в 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"
Интернет-инженер
источник
К сожалению, строка подключения в мастере не подходит для app.config. @leqid предложил хороший способ исправить путь к модели.
Der_Meister
5

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

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

Бен
источник
У меня недавно была эта проблема после внесения, казалось бы, никаких изменений. Пробовал перезагружать VS безрезультатно, но потом это исправили путем очистки и восстановления. Таким образом, для других, если вы не внесли никаких изменений, и все остальное кажется неуместным, попробуйте выполнить повторную сборку.
Грег
5

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

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

... до ...

metadata=res://*/DataModel.csdl
Грэм Лайт
источник
Это правда, если вы хотите переместить его в новую подпапку проекта, вам нужно добавить folder.subfolderперед ним.
qakmak
Спасибо, это решение сработало для меня. Я переместил свой файл .edmx из dir в одном проекте в корень другого проекта, и мне нужно было удалить имя dir из всех строк подключения в моем решении.
Крис
4

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

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

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

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

Дж. Стин
источник
4

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

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

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

2 - Выберите Run Custom Toolопцию

3 - Перестроить проект

MOH3N
источник
Это сработало для меня, но я также должен был восстановить после этого
rdans
3

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

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

Janmon
источник
3

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

Для всех вас, 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теперь находится в другом Assembley (внутри сборки проекта wcf),

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

ClassTypeThatResidesInEdmProject.Assembly.FullName 

радоваться, веселиться.

Robocide
источник
2

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

Адам
источник
2

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

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

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

Антуан Мельцхайм
источник
2

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

صفي
источник
2
К сожалению, это адрес и лечит симптом, а не причину.
Клариса Боувер
2

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

Кришна Шиднекоппа
источник
1

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

eagle779
источник
1

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

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

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

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

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

Крис
источник
1

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

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

Unable to load the specified metadata resource

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

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

Фрэнк Мьят Чт
источник
1

У меня была эта проблема вчера, и я искал мой код в отладке и вывод из SQL Profiler.

Прежде чем я прочитал и понял этот пост, я не мог понять, почему EntityFramework выдавал эту ошибку при вызове БД. Я просматривал сотни строк в SQL Profiler, пытаясь понять, что не так с моделью базы данных. Я не мог найти ничего похожего на звонок, который ожидал, и, честно говоря, я не был уверен, что искал.

Если вы находитесь в этом положении, проверьте строку подключения. Я предполагаю, что прежде чем EntityFramework создаст свой SQL, он проверит модель, указанную в части метаданных строки соединения. В моем случае это было неправильно. EntityFramework даже не доходил до БД.

Убедитесь, что имена верны. После того, как я с этим разобрался, я увидел вызовы в SQL Profiler, где ApplicationName был 'EntityFramework', где SQL вызывал ожидаемые таблицы.

Даниэль Холлинрейк
источник
1

Плохой файл app.config или web.config может сделать это .. Я скопировал строку подключения app.config в мой web.config в моем пользовательском интерфейсе и в итоге ввел:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
MyDaftQuestions
источник