Строка подключения с именем «MyEntities» не найдена в файле конфигурации приложения


246

Я использую Entity Framework и ASP.NET MVC 4 для создания приложения

Мое решение разделено на два проекта;

  • Библиотека классов, включающая мой файл модели данных (.edmx) и несколько пользовательских интерфейсов.
  • Контейнерный проект MVC, который ссылается на библиотеку классов выше

Моя проблема в том, что когда я пытаюсь использовать DbContext ' MyEntites ', я получаю следующую ошибку:

Не удалось найти строку подключения с именем «MyEntities» в файле конфигурации приложения.

Я предполагаю, что проблема как-то связана с тем, что строка подключения находится в app.config библиотеки классов, а не в проекте MVC.

У кого-нибудь есть предложения?


15
Не совсем тот же контекст, что и у вас (автоматическая миграция с EF6), но у меня возникла та же проблема с аналогичным сообщением об ошибке, когда я создал дочернюю ветку в TFS и начал работать над ней. Пометка проекта MVC как проекта запуска позволила решить эту проблему. выходной PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
Механический объект

Ответы:


309

Попробуйте скопировать строку соединений в файл .config в проекте MVC.


63
Работает отлично, но хотелось бы знать, почему указанный проект не использует свой собственный файл конфигурации для извлечения строки подключения.
Нулевая голова

7
@ Александр Старый вопрос, но да, я также хотел бы знать, почему.
Келан Крумме

22
@ Александр, платформа загружает и использует файл (ы) конфигурации для выполняющейся сборки. В данном случае это веб-проект. Библиотеки классов обычно не имеют своих собственных файлов конфигурации.
kiprainey

24
Команды Enable-Migration при запуске в контексте NuGet COnsole смотрят файл конфигурации Startup Projects, а не обязательно тот проект, в котором вы, как вы думаете, будут. Просто установите проект с app.config, который вы хотите использовать для запуска проект. При желании сохраните строки подключения в одном файле конфигурации, а затем назовите их в других проектах с помощью <connectionString configSource = "../ ProjectDir / SharedConnections.config" />
Райан Манн,

3
Я получил это точное сообщение об ошибке, но мой файл .config - в правильном проекте - действительно перечислил правильную строку подключения. Однако я использовал преобразования, и строка подключения, конечно, не была указана в преобразованном файле .config. Это то, на что нужно обратить внимание, если вы используете преобразования файла конфигурации.
Мортен Норгаард

143

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

Вам необходимо скопировать строку подключения в основной файл конфигурации проекта.

Если ваш стартовый / основной проект не имеет файла конфигурации (как это было в моем случае с консольным приложением), просто добавьте его (проект запуска - Добавить новый элемент -> Файл конфигурации приложения).

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


8
Ключевой ответ на этот вопрос заключается в том, что библиотека классов (где находится файл .edmx) не является вашим проектом STARTUP. Я понял, что мой стартовый проект не был настроен на проект, в котором был мой web.config. Это было консольное приложение с другим app.config. Поэтому, если вы добавляете консольные приложения в свое веб-решение, убедитесь, что ваш веб-проект является стартовым проектом при запуске update-database!
Карл

1
По какой-то причине я выгрузил свой основной проект, и после его перезагрузки я получил эту ошибку, пытаясь добавить миграции. Создание основного проекта запуска проекта снова решило проблему. Спасибо @Oren
Азадрум

2
Мой стартовый проект был изменен по ошибке. Это ключевой бит. Ваш ответ действительно помог!
Фабио Мильейру,

98

убедитесь, что вы делаете свой проект (с DbContext) в качестве запуска

на проекте правой кнопкой мыши и выберите

ИЛИ

Добавьте в проект, который задан в качестве запуска, строку подключения в app.config (или web.config)

ИЛИ

Вызови команду вот так

Update-Database -Script -ProjectName '<project name>' -StartupProjectName '<project name>' -ConnectionString 'data source=.;initial catalog=<db name>;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'

Тогда попробуйте еще раз


2
Это на самом деле проект содержит строку подключения, которая должна быть установлена ​​как стартовый проект, и обычно это не тот проект, в котором находится ваш файл DbContext
Raymond Wang

1
... таким образом, в дополнение к тому, чтобы убедиться, что Package Mgr нацелен на нужный слой, должен быть тот же самый слой Set as Startup Project- согласно скриншоту, показанному выше. (даже если вы нажмете F5, вы не сможете запустить библиотеку классов)
bkwdesign

3
Это спасло мою жизнь. Несмотря на то, что в Диспетчере пакетов мне был задан проект по умолчанию для проекта, в котором был задан контекст, он все равно не переопределился.
garfbradaz

1
«Но это сработало вчера! Точно такая же команда !» => ЭТО!
Simon_Weaver

1
Самый простой способ =)
Александр

29

Вы можете просто передать строку подключения EntityFrameworkи продолжить свою жизнь:

public partial class UtilityContext : DbContext
{
    static UtilityContext()
    {
        Database.SetInitializer<UtilityContext>(null);
    }

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    {
    }

    // DbSet, OnModelCreating, etc...
}

и сделал мой день также, потому что я не мог найти решение, почему мой проект запуска внезапно прекратил находить файл конфигурации. Мои app.config и <appname> .exe.config обнаруживались в моей корзине автозагрузки проекта, но EntityFramework не смог найти строку подключения, которую я использовал вечно. Недавно я удалил несколько неиспользуемых проектов из решения, и мне интересно, было ли это как-то связано с этим. Я удалил веб-проект из решения. Хотите знать, полагались ли мои другие проекты на web.config или что-то необычное в этом роде?
GrayDwarf

Конфигурация запущенного проекта используется всеми другими дочерними проектами.
Серж Саган,

1
а как установить имя провайдера?
FizxMike

9

Как вы предполагаете, это связано с тем, что строка подключения находится в app.config библиотеки классов.

Скопируйте запись из класса app.config в контейнер app.configили web.configфайл


8

Если у вас есть несколько проектов в решении, настройте проект как запущенный там, где у вас есть ваш App.config.


7

скопировать строку подключения app.configили web.configфайл в проекте, для которого установлено «Установить как StartUpпроект», и, если в случае использования инфраструктуры сущностей в проекте уровня данных - установите Nuget инфраструктуры сущностей в основном проекте.


4

Это также происходит , если проект стартапа изменен на тот, который не имеет в строках подключения .

  1. Решение правой кнопкой мыши - щелкните свойства
  2. Под Общими свойствами выберите запуск проекта
  3. На правой панели выберите проект, который имеет строки подключения (в большинстве случаев это будут проекты MVC - проект, который запускает решение)

Да, это работает. Я создал библиотеку классов для EF для связи с БД, и у меня возникла та же проблема.
Satinder Сидху

4
  1. Добавить файл App.Config
  2. Установите проект в качестве запуска проекта.
  3. Убедитесь, что вы добавили строки подключения после entityFrameworkраздела:

    <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>

3

Да, это глупо. Вы можете избежать копирования строки соединения с помощью компоновщика соединений. Код VB.Net (используется в производстве, но немного изменен здесь, поэтому рассматривается как непроверенный, готов помочь с любыми проблемами), где у меня есть переменная serverName, переменная databaseName, я передаю их в метод и генерирую соединение для меня:

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)

2

Вы используете более одного проекта в своем решении?

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


Да, это так. Проект, содержащий строку подключения, является библиотекой классов, которая включает только файл App.config. Проект MVC, кажется, не проверяет это.
jjc99

во время разработки он будет проверять только app.config своего проекта, вы должны добавить туда
Диего

Спасибо за ваш ответ. Я попытался скопировать строку подключения из проекта, содержащего файл edmx, и поместить его в корневой файл web.config в моем проекте MVC. К сожалению, он все еще не может найти строку подключения. Нужно ли каким-либо образом изменять строку подключения?
jjc99

это наоборот. Во время разработки вам понадобится строка con в app.cofnig в проекте с файлом .edmx. Если у вас есть, может быть, имя не так. Имя строки соединений должно совпадать с именем свойства "имя объекта сущности" в вашем файле .edmx
Diego


1

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

Чтобы избежать этой проблемы, вы должны:

  1. Вам нужна строка подключения в запущенном файле * .config.
  2. Вам необходимо установить DLL EntityFramework в ваши ссылки

1

Я столкнулся с той же проблемой. Мне не хватало положить строку подключения в автозагрузку проекта, так как я выполняю операцию доступа к данным с другого уровня. также, если у вас нет app.config в вашем проекте запуска, добавьте файл app.config и затем добавьте строку подключения в этот файл конфигурации.


1
Спасибо, у меня была проблема с загрузкой моего проекта, и он потерял "Startup Project". Ваш ответ напомнил мне, чтобы убедиться, что проект с файлом контекста и app.config был при запуске.
Мастро

1

Я получил это, не установив проект в качестве запуска, как указано в другом ответе. Мой вклад в это - когда вы выполняете Add-Migrations и Update-Database, укажите стартовый проект как часть команды в консоли диспетчера пакетов Nuget (не включайте символы '[' или ']', это просто для того, чтобы показать вам, что вы нужно изменить текст, расположенный там на название вашего проекта):

  1. Enable-Миграция
  2. Add-Migrations -StartupProject [имя вашего проекта, которое содержит класс контекста данных]
  3. Update-Database -StartupProject [то же имя проекта, что и выше]

Это должно сделать это.


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

1

Это потому, что ваш контекстный класс наследуется от DbContext. Я полагаю, ваш ctor выглядит так:

public MyEntities()
    : base("name=MyEntities")

name=... следует изменить на имя вашей connectionString


0

Строка подключения, сгенерированная проектом, содержащим файл .edmx, генерирует строку подключения, это может показаться удержанием файлов вида app.config, которые были скопированы в выходной каталог и на которые ссылается исполняемый файл для хранения информации конфигурации среды выполнения.

Это нарушает работу веб-проекта, поскольку отсутствует автоматический процесс добавления случайной информации .config в файл web.config для веб-проекта.

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


0

Лучший способ, который я только что нашел, - это временно установить этот проект (скорее всего, библиотеку классов) в стартовый проект. Это заставляет консоль диспетчера пакетов использовать этот проект в качестве источника конфигурации. одна из причин, по которой он настроен таким образом, заключается в модели сверху вниз, которой обычно следуют файлы econfig. Практическое правило заключается в том, что ближайший к клиенту проект (например, приложение MVC) - это файл web.config или app.config, который будет использоваться.


0

Убедитесь, что вы поместили строку подключения в ROOT web.config запуска проекта.

Я знаю, что в некотором роде заявляю об очевидном здесь, но это случилось и со мной - хотя у меня уже была строка подключения в моем проекте MVC Web.Config (файл .edmx был помещен в другой проект библиотеки классов), и я не мог не могу понять, почему я продолжаю получать исключение ... Короче говоря, я скопировал строку подключения в Views \ Web.Config по ошибке, в странной комбинации усталости и отсутствия прокрутки до конца сценарий решения проблемы. Да, такие вещи случаются и с опытными разработчиками :)


0

Эта проблема возникает, когда вы используете слои в своем проекте и определяете или устанавливаете фрейм Entity в DataLayer и пытаетесь запустить свой проект

Поэтому, чтобы преодолеть эту проблему, скопируйте строку подключения из слоя, где находится файл Edmx, и вставьте строку подключения в основной файл web.config.


0

Добавьте строку подключения в корневой файл web.config проекта MVC 'container', который ссылается на библиотеку классов следующим образом:

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

Если вы не хотите использовать «MyEntities» в качестве имени подключения, измените его по своему желанию, но сделайте следующее изменение в своем классе MyEntities DbContext:

MyEntities: DbContext
 {
   public MyEntities():base("Name-Of-connection-string-you wish to connect"){ }
 }

Причина этой ошибки: если мы не будем указывать имя строки подключения или строку подключения в производном классе DbConext (в вашем случае это MyEntities), тогда DbContext автоматически выполнит поиск строки подключения в корневом файле web.config, имя которого - то же самое, что и имя производного класса (в вашем случае это My Entities).


0

У меня была эта проблема при запуске MSTest. Я не мог заставить его работать без флага "noisolation".

Надеюсь, это кому-нибудь поможет. Это стоило мне много времени, чтобы понять это. Все отлично работает из IDE. Что-то странное в Entity Framework в этом контексте.


0

Регулярные миграции

Есть два варианта - первый, который предложили здесь все, - убедиться, что строка подключения находится в файле Web.config проекта. При работе со строками подключения из параметров приложения Azure это означает, что значения Web.config будут перезаписаны значениями Azure.

Azure или автоматическая миграция (программная)

Существует вторая опция, если вы запускаете миграцию программно, которая позволяет запускать миграции с использованием строки подключения, которая получается динамически (или с помощью параметров приложения Azure), не сохраняя ее в Web.config:

При настройке конфигурации TargetDatabase используйте конструктор DbConnectionInfo, который принимает строку подключения и имя поставщика, а не конструктор, который принимает только имя подключения. Если в строке подключения нет имени поставщика, и вы используете SQL Server / Azure SQL, используйте «System.Data.SqlClient»


0

Это также может привести к тому, что в вызывающем коде будет недостаточно ссылок на dll. Небольшой неуклюжий взлом может спасти ваш день.

Я следовал подходу DB First и создал файл EDMX в проекте библиотеки классов DAL, который имел ссылку на библиотеку классов BAL, на которую в свою очередь ссылалась служба WCF.

Так как я получал эту ошибку в BAL, я попробовал вышеупомянутый метод, чтобы скопировать детали конфигурации из App.config проекта DAL, но не решил. В конце концов, по совету друга, я просто добавил фиктивный файл EDMX в проект WCF (с соответствующим подключением к БД и т. Д.), Поэтому он импортировал все необходимое, а затем я просто удалил файл EDMX и просто избавился от проблемы с чистая сборка.


0

На верхний ответ @RyanMann есть комментарий, который предполагает:

Сохраните строки подключения в одном файле конфигурации, а затем назовите их в других проектах <connectionString configSource="../ProjectDir/SharedConnections.config" />

Это фантастическое предложение!

Он также работает для обмена строками соединения между файлами App.config и Web.config!

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

Единственное предостережение заключается в том, что он configSourceдолжен существовать в том же каталоге или подкаталоге. Ссылка выше объясняет, как использовать «Добавить как ссылку», чтобы обойти это.


0

У меня была эта ошибка при попытке использовать EF в плагине AutoCAD. Плагины САПР получают строку подключения из файла acad.exe.config. Добавьте строку подключения, как указано выше, в файл конфигурации acad, и она работает.

Кредит идет на Норман. Юань от ADN.Network.


0

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

Например, если ваше решение содержит два проекта: проект библиотеки классов и проект wpf, вы должны скопировать строки подключения внутреннего проекта (библиотеки классов porject) и поместить копию в файл App.config проекта wpf.

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

Надеюсь, это полезно для вас :)


-2

Добавьте Connectoinstrnig в файл web.config

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.