Исключение EF 4.1 «Поставщик не вернул строку ProviderManifestToken»

88

Я пытаюсь воспроизвести пример, найденный в MSDN. Я использую ASP.NET и EF 4.1 (CTP?). Я использовал NuGet для установки пакета EntityFramework.

Я получаю эту ошибку: The provider did not return a ProviderManifestToken string... и база данных никогда не создается.

Вот моя строка подключения:

<add name="HospitalContext"
   connectionString=
   "data source=.\SQLExpress;initial catalog=NewTestDB;integrated security=True;"
   providerName="System.Data.SqlClient"/>

Вот мой код:

var pat = new Patient { Name = "Shane123132524356436435234" };
db.Patients.Add(pat);

var labResult = new LabResult { Result = "bad", Patient = pat };

int recordAffected = db.SaveChanges();

Вот мой контекст:

public class HospitalContext : DbContext
{
    static HospitalContext()
    {
        Database.SetInitializer(new HostpitalContextInitializer());
    }

    public DbSet<Patient> Patients { get; set; }
    public DbSet<LabResult> LabResults { get; set; }
}

public class HostpitalContextInitializer :
             DropCreateDatabaseIfModelChanges<HospitalContext>
{
    protected override void Seed(HospitalContext context)
    {
        context.Patients.Add(new Patient { Name = "Fred Peters" });
        context.Patients.Add(new Patient { Name = "John Smith" });
        context.Patients.Add(new Patient { Name = "Karen Fredricks" });
    }
}

Это полностью пропатченная система SQL 2008 с VS 2010 SP1.

бугнукер
источник
Казалось бы, после добавления [Key] к модели эта проблема решена. У меня все еще есть другая проблема, но это могло решить ее.
bugnuker
Кроме того, возможно, я добавил «Intergrated security = true» в свою строку подключения ...
bugnuker
У меня такое же исключение при работе сSqlServerCe.Entity.dll
Nano Taboada
2
В интересах вещей, которые могут вызвать это исключение - я провожу 20 минут, глядя на опечатку в имени строки подключения, которая должна соответствовать имени контекста.
justSteve

Ответы:

184

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

сволочь
источник
В моем случае срок действия пароля сервера sql истек
mklein
3
Спасибо, что указали мне правильное направление. Моя служба SQL Express не была запущена - да!
camainc
Хорошее старое внутреннее исключение ... у меня было неправильное имя моей БД, когда я указал EF на новое место резервной копии ... забавная вещь, я проверил InnerEx, и ваш комментарий заставил меня вернуться и перечитать его ... Престижность!
Andy Danger Gagne
Использовал встроенную безопасность, у IIS AppPool не было необходимых прав.
Винсент Ванкалберг,
+1 - (Мой домашний IP изменен) Сообщение об ошибке: Невозможно открыть сервер «ИМЯ СЕРВЕРА», запрошенный логином. Клиенту с IP-адресом MY_OLD_IP не разрешен доступ к серверу. Чтобы включить доступ, используйте портал SQL Azure или запустите процедуру sp_set_firewall_rule в базе данных master, чтобы создать правило брандмауэра для этого IP-адреса или диапазона адресов. Чтобы это изменение вступило в силу, может потребоваться до пяти минут. \ R \ nСбой входа в систему для пользователя MYADMINACCT. \ R \ nЭтому сеансу был назначен идентификатор трассировки GUID. Если вам потребуется помощь, предоставьте этот идентификатор для отслеживания в службу поддержки ».}
Дилан Хейс,
8

Иногда это может произойти, если вы помещаете строку подключения в app.config неправильного проекта в Visual Studio.

Например, у меня возникла эта проблема в проекте EF 4.1 (выпущенная версия) + проекте службы данных WCF, и я заметил, что у меня не было строки подключения, указанной в проекте служб данных, где она использовалась.

Прит Сангха
источник
Это было моим решением. Мне пришлось вставить правильную строку подключения в запускаемый проект.
MickJuice 02
5

У меня была такая же ошибка, и на самом деле это была ошибка входа на указанный сервер. Я удалил атрибут «Integrated Security» из строки подключения конфигурации, и он сработал.

Ракеш Сингх
источник
Это сработало для меня. Любой другой, у кого есть эта проблема, должен попробовать это, если другие решения не работают.
Джастин
Эта ошибка возникла, когда на моем компьютере была отключена служба SQL Express.
John M
4

У меня была такая же проблема, и я добавляю приведенный ниже код сразу после экземпляра моего контекста (загрузка по примеру)

context.Database.Connection.ConnectionString = @"Data Source=.\SQLExpress;Initial Catalog=Test;Integrated Security=True";
toto123
источник
4

У меня была аналогичная проблема с приложением MvcMusicStore. Я изменил строку в Web.config с «Instance = true» на «Instance = false». Иногда это работает без этой настройки, но я не знаю, в чем разница. Чтение http://msdn.microsoft.com/en-us/library/ms254504.aspx действительно не помогло.

Xuvion
источник
Удивительно ... это было правильное решение для меня. Понятия не имею почему.
Kees C. Bakker
2

По какой-то определенной причине разрешения EF не может создать соединение с базой данных. Я столкнулся с одной и той же проблемой всего один день. Наконец, я попробовал следующее решение, и оно сработало: a / Откройте IIS (я использую IIS 7) b / Откройте дополнительные настройки appool, который использовал веб-сайт (например, DefaultAppPool) c / Посмотрите на группу модели процесса, измените значение идентификатора в "Локальную систему"

Надеюсь, это сработает с вами.

Телвин Нгуен
источник
2

У меня была такая же проблема ...
решение, которое сработало для меня, было:
запустить инструмент настройки клиентской сети (введите cliconfg в Run)
и убедитесь, что TCP / IP включен.

user1168945
источник
2

Я наконец его взломал - после небольшой погони за дикими гусями подумал, что это из-за разрешений.

Откровение: ИСПОЛЬЗУЙТЕ SQL PROFILER

(Примечание: я недавно перешел с EF6 на EF5)

Используя SQL Profiler, я быстро нашел последний SQL-запрос, выполненный перед сообщенной ошибкой:

SELECT TOP (1) 
[Project1].[C1] AS [C1], 
[Project1].[MigrationId] AS [MigrationId], 
[Project1].[Model] AS [Model]
FROM ( SELECT 
    [Extent1].[MigrationId] AS [MigrationId], 
    [Extent1].[Model] AS [Model], 
    1 AS [C1]
    FROM [dbo].[__MigrationHistory] AS [Extent1]
)  AS [Project1]
ORDER BY [Project1].[MigrationId] DESC

Посмотрите на это - что-то связано с миграциями. Он смотрит в __MigrationHistoryтаблицу, которую я даже не осознавал, что она была создана (я уже уничтожил миграции в моем CSPROJ) и очистил это.

Поэтому я вытаскиваю строки для этой таблицы и вижу, что она привязана к конкретной версии продукта (v6).

введите описание изображения здесь

Я фактически понизил версию EF6 (которую я не собирался устанавливать в первую очередь) до EF5 (которая более совместима с лесами), и это когда начались проблемы.

Я предполагаю, что Model (<Binary data>)столбец не имеет обратной совместимости - отсюда и The provider did not return a ProviderManifest instanceошибка, поскольку он не смог его декодировать.

Мне нечего было терять, я просто стер этот стол полностью и побежал, Update-Database -Verboseа затем снова заработал.

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

Simon_Weaver
источник
Я закончил тем, что полностью отбросил таблицу __MigrationsHistory и перекомпоновал с помощью Add-Migrationи Update-Database -Verbose -Force. вот ссылка на команду coding.abel.nu/2012/03/ef-migrations-command-reference
Simon_Weaver
важно то, что это не только ошибка разрешений
Simon_Weaver
1

При использовании Visual Studio 11 Beta с EF4.1 и ASP.NET MVC я чуть не вырвал волосы, пока не нашел

http://connect.microsoft.com/VisualStudio/feedback/details/740623/asp-net-mvc-4-default-connection-string-improperly-escaped

Чтобы решить свою проблему, я зашел в Application_Start и изменил

Database.DefaultConnectionFactory = new SqlConnectionFactory ("Источник данных = (localdb) \ v11.0; Интегрированная безопасность = True; MultipleActiveResultSets = True");

к

Database.DefaultConnectionFactory = new SqlConnectionFactory ( @ "Data Source = (localdb) \ v11.0; Integrated Security = True; MultipleActiveResultSets = True");

GaTechThomas
источник
Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");добавили в мой Mainметод, теперь работает как шарм! Большое спасибо.
Rotgers 08
1

Эта ошибка присутствует только при открытом EDMX-файле и исчезает, как только файл снова закрывается.

Эта цитата из CodePlex , это сработало со мной (Visual Studio 2013 / MVC 5)

Feras
источник
Со мной тоже работали. Пытался закрыть и снова открыть файл edmx. Работал.
Rohit
1

Еще одна вещь, которую следует учитывать при использовании EF Code First, заключается в том, что иногда она не создает автоматически резервную базу данных для вашего класса DbContext. Решение состоит в том, чтобы добавить свою собственную строку подключения - вы можете использовать строку подключения, которая может присутствовать для обработки базы данных пользователей / регистрации, которая поддерживает Simple Membership Provider, в качестве шаблона. Наконец, вам нужно будет добавить конструктор по умолчанию для созданного вами класса DbContext:

public ChaletDb():base("ChaletConnection")
    {

    }

Здесь имя строки подключения, введенное вами в файл web.config, используется для направления DbContext для создания базы данных. Изредка мне приходилось вручную создавать базу данных (в SQL Server Management Studio), что заставляло ее работать.

Джон Келлехер
источник
0

У меня есть несколько проектов в решении, и я добавлял EF в каждый проект в разное время. На некоторых машинах он работал, а на некоторых не работал с вышеупомянутой ошибкой. Мне потребовалось некоторое время, чтобы заметить, что некоторые из моих проектов app.config имеют следующее:

    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>

Это нормально, если вы используете LocalDb (например, новый "sql express"), но совершенно неправильно, если у вас не установлен этот конкретный сервер и вы используете обычный SQL.

Решение: удалите указанный выше код.

Олег К
источник
0

Это потому, что соединение с SQL-сервером не удалось.

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

Если вы сгенерировали DbContext из родительского потока (например, с помощью внедрения зависимостей), а затем выдавали себя за другого пользователя, возникла бы эта ошибка. Решением было бы сгенерировать DbContext внутри нового потока или нового контекста олицетворения.

justcoding121
источник
0

Я просто закрыл все экземпляры Visual Studio и снова открыл свое решение.

Я не знаю, что произошло на самом деле, но у меня было одно и то же решение, открытое из двух разных локальных рабочих пространств (одно с моими локальными изменениями, другое с неизмененным исходным кодом репозитория). Я работаю с БД postgres, Entity Framework 6, Visual Studio 2013 и ASP.NET MVC 5.

Чувак Паскалу
источник
0

У меня была ошибка для структуры сущностей, но ни один из приведенных выше ответов не подошел к решению, которое, наконец, сработало.

Мои первые модели кода EntityFramework и DataContext находились в отдельном проекте от моего основного проекта WebAPI. Мой проект Entity Framework где-то по линии кодирования был установлен как запускаемый проект, и поэтому, когда я выполнял миграцию, я получал: «Поставщик не вернул строку ProviderManifestToken» ... проблема с подключением.

Оказывается, поскольку ConnectionString для БД находится в файле Web.config в основном проекте WebAPI, когда я выполнял миграцию, строка подключения не была получена. Установив проект WebAPI в качестве моего startProject, я смог успешно подключиться.

Бессонный ниндзя
источник