Зазначене іменоване з'єднання або не знайдено в конфігурації, не призначене для використання з провайдером EntityClient, або недійсне


170

У мене є один об'єкт Entity Framework , і коли я додати його в свій проект, то connectionstring додається app.configв connectionstringсекції, але коли я хочу , щоб створити новий entitycontextі використовувати це connectionstring, це помилка з'являється



4
Дякую за посилання, Крейг. Я голосую за те, щоб зберегти цю тему, тому що саме заголовок допоміг мені виявити помилку MetadataException.
jp2code

Це трапилося зі мною, коли конфігураційний файл з якихось дивних причин не оновлювався рядком з'єднання.
P.Brian.Mackey

Відповіді:


217

Я підозрюю, що ваша проблема випливає з того, що у вас є кілька проектів у вашому рішенні, а той, який містить ваші рамки сутності, включаючи edmxфайли, НЕ є запуском проекту. У цьому випадку, навіть якщо рядок підключення існує в проекті EF app.config, CLR все ще не може знайти її під час виконання. Наприклад, якщо у вашому рішенні є веб-сайт та проект EF, вам потрібно скопіювати рядок з'єднання з проекту EF app.configна свій веб-сайт web.config. По суті, будь-які дані рядкових з'єднань повинні існувати у конфігураційному файлі проекту, з якого потоки .Net ініціюються CLR (тобто ваш проект запуску). Якщо це не ваш випадок, тоді просто відкрийте свійedmxФайл, клацніть правою кнопкою миші на його поверхні, виберіть властивості та скопіюйте рядок з'єднання та вставте його у app.configрозділ "Підключення". Таким чином, ви можете переконатися, що ви маєте правильний у своєму конфігурації

РЕДАКТУВАННЯ:
Як ви можете бачити тут на Documenation на ObjectContext Constructor , першим параметром є ім’я stringstring , яке створюється кодом під час створення EDM. Якщо якимось чином ім'я вашого імені з'єднання не змінюється, все, що вам потрібно зробити, - це клацнути правою кнопкою миші на вашій моделі та вибрати "Оновити модель з бази даних ...", то слідуйте за майстром, щоб оновити конфігурацію та дизайнера, щоб це відобразило. змінити.


1
привіт, Мортеза і дякую за вашу відповідь, але я попередньо скопіював sectin connectionstring у web.config, але помилка не вирішена, але коли в entitmodel.designer замінити (public EntityContext (): base ("name = EntityContext", EntityContext " )) хоч з'єднанняз ​​цим рядком спрацювало, будь-який idae
user421413

1
@Morteza, чи є у вас рішення для проектів, у яких виконаюча збірка не має app.config? У моєму випадку виконуваним викликом є ​​додаток VB6, який викликає мою збірку (де є об'єкти сутності) через COM Interop.
швидкопсувний Дейв

4
такий простий, але такий неприємний. Вгору ГОЛОС. Хай живе стаковерх!
granadaCoder

3
Якщо ви використовуєте WCF, не забудьте включити рядок підключення до свого сервісного проекту
Натан

1
Дякую Мортеза, врятував мені багато часу!
Кріс

32

Вам потрібно скопіювати рядок підключення в app.config на ваш web.config або скопіювати весь файл у проект, який відображає вихід. Це одна з умов споживання основи.


1
просто додайте ту саму рядок з'єднання (як у проект доступу до даних) у свій web.config (знайдений у передньому проекті).
Данія

@ Musikero31 Я використовую EF і визначаю всі рядки з'єднання сутності в коді. Я не маю нічого в налаштуваннях, що стосуються цього.
Кіт Борода

Після того як я скопіював файли DAL в новий проект, я також отримав вищевказану помилку. Придивившись ближче до конфігураційних файлів, я помітив, що рядок з'єднання замінено EF. Я зміг вручну скопіювати / вставити правильний рядок з'єднання в новий проект, і він спрацював.
Раві Рам

9

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

Хоча .dll мав правильний файл app.config, він не працював. Суб'єкти фреймворку бажали інформації про з'єднання в app.config .exe. Копіювання інформації туди працювало чудово.

Рішення Мортези вставити рядок з'єднання безпосередньо у .edmx не працювало для мене, оскільки це не дозволило б мені вставити значення туди, хоча саме це я хотів зробити.


3
Незважаючи на те, що в каталозі мого файлу Exe був лише app.config (і це був єдиний конфігураційний файл у цьому каталозі), він не прочитав би його. Мені довелося перейменувати файл myExe.exe.config
Маріо

6

Привіт, у мене була ця проблема, і це змусило мене зрідити. У всякому разі, я нарешті зрозумів, у чому проблема. Перше, що вам потрібно зробити, це переконатися, що connectionstringsв app.configі web.configвони однакові. Потім потрібно двічі клацнути по .edmxфайлу, щоб ви могли бачити таблиці. Коли ви натискаєте будь-де біля таблиць, але не на них, і переходите до властивостей. З випадаючого списку виберіть ConceptualEntityModelі шукайте ім'я контейнера об'єкта та запам'ятайте його.

Далі перейдіть до конструктора файлу edmx та відкрийте конструктори. (конструктор - це підпапка файлу edmx), конструктори повинні мати два параметри в параметрі BASE

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

це одна з них. перший параметр повинен мати ім'я файлу проекту, в якому знаходиться .edmxфайл. Другий параметр повинен мати ім'я імені контейнера об'єкта з властивостей, про які я згадував раніше. не забудьте влаштувати всіх конструкторів із:base("", "")

Принаймні, це була моя проблема, і моя проблема була вирішена так. Я сподіваюся, вам вдасться вирішити ваше так.


6

У мене була різниця в цьому, яку, схоже, ніхто не висвітлював.

У мене був головний проект з парою моделей і Тестовий проект, що містить одиничні тести. Тестовий проект працював, але потім припинився з помилкою, згаданою в ОП. Я не робив жодного перейменування чи переміщення файлу EDMX.

Багато порад згадували про порівняння файлів .config, але в моєму проекті його взагалі не було.

Врешті-решт я скопіював файл app.config з головного проекту у свій тестовий проект, а потім він працював. Чи це правильний крок, чи виникнуть проблеми з ремонтом при додаванні додаткових моделей, я не знаю, але принаймні мої тестові одиниці зараз знову працюють правильно.


Оскільки я опублікував це, я зрозумів, що, мабуть, найкраще буде створити посилання на файл app.config іншого проекту. Але все ж інший підхід буде працювати для виправлення вихідної проблеми, коли конфігураційного файлу взагалі немає.
С. Баггі

4

Хоча відповідь Мортези Манаві вирішує цю проблему, іншим рішенням є динамічне створення рядка з'єднання та передача його в конструктор для вашого ObjectContext:

public static string CreateConnectionString()
{
    var assemblyPath = Assembly.GetExecutingAssembly().Location;
    string assemblyLocation = Path.GetDirectoryName(assemblyPath);
    string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
    var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };

    var entityBuilder = new EntityConnectionStringBuilder
    {
        ProviderConnectionString = sqlBuilder.ConnectionString,
        Provider = "System.Data.SqlServerCe.3.5",
        Metadata = @"res://*/YourModel.csdl|
                 res://*/YourModel.ssdl|
                 res://*/YourModel.msl"
    };

    return entityBuilder.ToString();
}

// Snip...

var entityContext = new YourObjectContext(CreateConnectionString());

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


4

Я забув додати providerName = "System.Data.EntityClient" як атрибут у рядку з'єднання. Це призвело до цієї помилки

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

замість

<add name="connectionName" connectionString="metadata=res://*/..." />

2

Щойно я виявив, що якщо програма створена в IIS з VS2010 на двох рівнях від кореня веб-сайту, ця помилка станеться. Не впевнений, чому це відбувається, потрібно було б розслідувати більше. Наприклад, якщо ваша програма знаходиться на цьому шляху: /admin/advertiserпомилка з’явиться, якщо /adminу вас на сайті IIS немає віртуального каталогу.

Все, що я зробив, це створити порожній adminкаталог, у мене .../intepub/wwwrootпомилка зникла.

Ви побачите, що не зможете розпочати налагодження, доки не зробите крок вище.

У нас в минулому ця проблема була в нашій команді, потрібно було трохи часу запам'ятати, але саме так ми і вирішували її раніше.


1

Я використовую архітектуру n'tier і отримав ту саму проблему, але ця допоможе мені. Сподіваюся, це допоможе вам. По- перше у вас є ж connection stringна вас , librariesде ви можете отримати доступ до БД , як в app.configі web.config після того, що ви просто додати конструктор в EDMX - файл в перевантаженому (Model.context.cs) , що тепер у вас є два конструктора один з замовчуванням , а інший у тільки що додала ( перевантажений).

        public YourEntityName(string connString)
            : base(connString)
        {
        }

1

У мене була бібліотека класів, яка теж не хотіла працювати з EF. Після того як я скопіював app.config (або просто розділ stringstring) з моєї бібліотеки класів до проекту EXE, з'єднання справно працювало! Можливо, очікується, що файл конфігурації буде в тій же папці, що і проект exe, і тому його не знайдено. Тому завжди будьте обережні, коли в проекті бібліотеки класів використовується конфігураційний файл!


0

Ну ... ця проблема може бути також з дуже простої (німої) причини ... Я скопіював файл з іншого проекту і забув змінити ConnectionString на EntityDataSource ... як я був на початку проекту і стався на сторінці входу я подумав, що це щось на конфігурації, але це просто неправильна назва рядка з'єднання (і DefaultContainerName).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.