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

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

Ответ 1

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



EDIT:

Как вы можете видеть здесь Documenation на ObjectContext Constructor, первым параметром является имя соединительной строки, которое является кодом, созданным во время создания вашего EDM. Если каким-то образом имя вашего имени соединительной строки должно быть изменено, все, что вам нужно сделать, это щелкнуть правой кнопкой мыши на вашей модели и выбрать "Обновить модель из базы данных...", затем следовать мастеру, чтобы обновить ваше приложение и конструктор, чтобы отразить это изменение.

Ответ 2

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

Ответ 3

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

В то время как .dll имел правильный файл app.config, он не работал. Структуры Entity хотели получить информацию о соединении в app.config файла .exe. Копирование информации там просто отлично.

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

вместо

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

Ответ 8

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

Все, что я сделал, создается пустой каталог admin в моей ошибке .../intepub/wwwroot.

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

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

Ответ 9

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

Ответ 10

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

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