У меня есть один объект фреймворка объекта, и когда я добавляю его в свой проект, connectionstring
добавляется в app.config
в разделе connectionstring
, но когда я хочу создать новый entitycontext
и использовать этот connectionstring
, появляется эта ошибка
Указанное именованное соединение либо не находится в конфигурации, не предназначено для использования с поставщиком EntityClient, либо недействительно
Ответ 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)
{
}