У файлі конфігурації програми не було знайдено жодної рядки з'єднання з назвою "MyEntities"


246

Я використовую структуру сутності та 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
Працює ідеально, але хотілося б знати, чому посилається проект не використовує власний конфігураційний файл для отримання рядка з'єднання.
Null Head

7
@ Олександр Старе питання, але так, я також хотів би знати, чому.
Келан Крумме

22
@Alexander, фреймворк завантажує та використовує конфігураційні файли (файли) для виконання збірки. У цьому випадку це веб-проект. Бібліотеки класів зазвичай не мають власних файлів конфігурації.
kiprainey

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

3
Я отримав це точне повідомлення про помилку, але мій файл .config - у правильному проекті - справді вказав правильний рядок з'єднання. Однак я використовував перетворення, і рядок з'єднання, звичайно, не посилався на перетворений .config-файл. Тож на це варто звернути увагу, якщо ви використовуєте перетворення конфігураційних файлів.
Morten Nørgaard

143

Ви маєте рацію, це відбувається тому, що бібліотека класів (де файл .edmx) не є вашим запуском / головним проектом.

Вам потрібно буде скопіювати рядок з'єднання в основний файл конфігурації проекту.

Якщо ваш стартовий / основний проект не має конфігураційного файлу (як це було у моєму випадку програми консолі), просто додайте один (проект запуску - Додати новий елемент -> файл конфігурації програми).

Більш релевантну інформацію можна знайти тут: MetadataException: Не вдається завантажити вказаний ресурс метаданих


8
Ключова відповідь на це полягає в тому, що бібліотека класів (де файл .edmx) не є вашим проектом STARTUP. Я зрозумів, що мій стартовий проект не був встановлений на проект, у якому був мій web.config. Це був консольний додаток з іншим app.config. Тож якщо ви додаєте консольні програми у своє веб-рішення, переконайтеся, що ваш веб-проект - це проект запуску, коли ви запускаєте оновлення-базу даних!
Карл

1
Я чомусь розвантажив свій основний проект, і після його перезавантаження я отримав цю помилку, намагаючись додати міграцію. Створення головного запуску проекту знову вирішило проблему. Дякуємо @Oren
Azadrum

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
Реймонд Ван

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проект", і якщо у випадку використання сутності фреймворку в проектному шарі даних - будь ласка, встановіть сукупність нуля фреймворку сутності в головному проекті.


4

Це також відбувається , якщо проект стартапу змінений на той, який НЕ має в рядках підключення .

  1. Клацніть правою кнопкою миші Рішення - клацніть властивості
  2. У розділі Загальні властивості виберіть проект запуску
  3. На правій панелі виберіть проект, у якому є рядки підключення (в більшості випадків це будуть проекти MVC - проект, який запускає рішення)

Так, це працює. Я створив бібліотеку класів для EF, щоб спілкуватися з БД і отримував ту ж проблему.
Satinder Sidhu

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

Ви використовуєте більше одного проекту для свого рішення?

Тому що, якщо ви є, веб-конфігурація, яку ви повинні перевірити, - це той самий проект, що і файл .edmx


Так, це справа. Проект, що містить рядок з'єднання, - це бібліотека класів, яка включає лише файл App.config. Проект MVC, схоже, не перевіряє це.
jjc99

під час розробки він лише вилучить програму app.config над своїм проектом, потрібно додати туди
Дієго

Дякуємо, що відповіли. Я спробував скопіювати рядок з'єднання з проекту, що містить файл edmx, і розмістити його в кореневому файлі web.config в моєму проекті MVC. На жаль, він досі не може знайти рядок з'єднання. Чи потрібно якось змінювати рядок з'єднання?
jjc99

це навпаки. У розроблений час вам потрібен con string на app.cofnig у проекті, що має файл .edmx. Якщо у вас є, можливо, ім'я неправильне. Назва рядка підключень має бути тим самим іменем, що і властивість "ім'я містити сутність" вашого файлу .edmx
Дієго


1

У мене була ця проблема, коли я використовую декілька проектів, запуску proyect з web.config та app.config для проекту EntityFramework.

щоб уникнути цієї проблеми, ви повинні:

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

1

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


1
Дякую, у мене виникла проблема з завантаженням проекту, і він втратив "Запуск проекту". Ваша відповідь нагадала мені переконатися, що проект із файлом Context та app.config був запуском.
Мастро

1

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

  1. Увімкнути-міграцію
  2. Add-Migrations -StartupProject [назва вашого проекту, що містить контекстний клас даних]
  3. Update-Database -StartupProject [та сама назва проекту, як і вище]

Це повинно це робити.


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

1

Це тому, що ваш контекстний клас успадковується від DbContext. Я думаю, що ваш ctor такий:

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

name=... має бути змінено на ім'я з'єднання


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, який посилається на бібліотеку класів наступним чином:

 <connectionStrings>

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

  </connectionStrings>

Якщо ви не хочете використовувати "MyEntities" як ім'я з'єднання, то змініть його за своїм бажанням, але внесіть наступні зміни у свій клас DbContext MyEntities:

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

Причина цієї помилки полягає в тому, що якщо ми не будемо вказувати назву рядка з'єднання Або підключити рядок у похідному класі DbConext (у вашому випадку це MyEntities), тоді DbContext автоматично шукатиме рядок з'єднання в кореневому файлі web.config, хто має ім'я так само, як похідне ім'я класу (у вашому випадку це "Мої особи").


0

У мене була ця проблема під час запуску MSTest. Я не міг би змусити його працювати без прапора "шумування".

Сподіваємось, це комусь допомагає. Коштувати мені багато часу, щоб зрозуміти це. З IDE все пройшло нормально. Щось дивне в Entity Framework в цьому контексті.


0

Регулярні міграції

Є два варіанти - перший, який запропонували всі тут, - переконатися, що рядок з'єднання знаходиться у файлі Web.config проекту. Під час роботи з рядками підключення з налаштувань програми Azure, це означає перезапис ваших значень Web.config зі значеннями Azure.

Лабораторна або автоматична міграція (програмна)

Існує другий варіант, якщо ви виконуєте міграцію програмно, що дозволяє запускати міграції, використовуючи рядок з'єднання, що отримується динамічно (або через налаштування додатка Azure), не зберігаючи її у Web.config:

Під час встановлення бази даних TargetData конфігурації використовуйте конструктор 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. Плагіни CAD отримують рядок з'єднання з файлу acad.exe.config. Додайте рядок підключення, як було зазначено вище, у файл конфігурації акад., І він працює.

Кредит надходить до Norman.Yuan від ADN.Network.


0

Якщо ви використовуєте модель MVVM, спробуйте скопіювати рядки підключення до всіх частин вашого проекту.

Наприклад, якщо ваше рішення містить два проекти, проект бібліотеки класів та проект wpf, ви повинні скопіювати рядки підключення проекту бекенда (проект бібліотечного класу) та розмістити копію у файлі 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.