Указанное именованное соединение либо не найдено в конфигурации, не предназначено для использования с поставщиком EntityClient, либо недопустимо - PullRequest
166 голосов
/ 16 августа 2010

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

Ответы [ 10 ]

216 голосов
/ 17 августа 2010

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

EDIT:
Как вы можете видеть здесь на Документация по конструктору ObjectContext , первый параметр - это имя строки подключения, которая является кодом, сгенерированным во время создания вашей EDM. Если каким-то образом имя вашей строки подключения случайно изменится, все, что вам нужно сделать, это щелкнуть правой кнопкой мыши на вашей модели и выбрать «Обновить модель из базы данных ...» , затем следуйте указаниям мастера, чтобы обновить ваш Confing и дизайнер, чтобы отразить это изменение.

31 голосов
/ 29 октября 2011

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

9 голосов
/ 28 сентября 2010

Я столкнулся с этой проблемой, когда попытался поместить свою пользовательскую логику базы данных в DLL-файл, который будет использоваться несколькими проектами в моем решении.

Хотя DLL-файл имел правильный файл app.config,не работалПлатформа сущностей хотела получить информацию о соединении в файле app.config .exe.Копирование туда информации работало просто отлично.

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

6 голосов
/ 11 декабря 2012

У меня был вариант этого, который, казалось, никто не охватывал.

У меня был основной проект с парой моделей и тестовый проект, содержащий юнит-тесты. Тестовый проект работал, но затем остановился с ошибкой, упомянутой в ОП. Я не делал переименования или перемещения файла EDMX.

Много советов упоминалось при сравнении файлов .config, но в моем проекте их вообще не было.

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

6 голосов
/ 29 ноября 2012

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

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

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

, это один из них.первый параметр должен иметь имя файла проекта, в котором находится файл .edmx. Второй параметр должен иметь имя имени контейнера сущности из свойств, о которых я упоминал ранее.не забудьте организовать все конструкторы с помощью: base("", "")

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

4 голосов
/ 17 июня 2014

Я забыл добавить providerName = "System.Data.EntityClient" в качестве атрибута в строке подключения.Это привело к этой ошибке, поэтому

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

вместо

<add name="connectionName" connectionString="metadata=res://*/..." />
4 голосов
/ 12 ноября 2012

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

2 голосов
/ 18 июля 2012

Я только что обнаружил, что если приложение будет создано в IIS из VS2010 на двух уровнях от корня веб-сайта, эта ошибка возникнет. Не уверен, почему это происходит, нужно будет расследовать больше. Например, если ваше приложение находится по этому пути: /admin/advertiser, появится ошибка, если на вашем сайте IIS нет виртуального каталога /admin.

Я только что создал пустую директорию admin в моей ошибке .../intepub/wwwroot.

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

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

1 голос
/ 22 марта 2016

Я использую более раннюю архитектуру и получил ту же проблему, но эта помогла мне. Надеюсь, это поможет вам. Сначала у вас есть connection string на libraries, где вы можете получить доступ к БД, как в app.config и web.config после этого вы просто добавляете перегруженный конструктор в файл .edmx (Model.context.cs), теперь у вас есть два конструктора, один из которых по умолчанию, а другой только что добавлен (перегружен).

        public YourEntityName(string connString)
            : base(connString)
        {
        }
1 голос
/ 07 июня 2012

У меня была библиотека классов, которая тоже не хотела работать с EF. После того, как я скопировал app.config (или просто раздел строки соединения) из моего библиотечного класса в exe-проект, соединение заработало нормально! Вероятно, файл конфигурации должен находиться в той же папке, что и exe-проект, и поэтому не был найден. Поэтому всегда будьте особенно внимательны, когда файлы конфигурации используются в проекте библиотеки классов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...