2014-01-17 2 views
33

Мы используем EntityFramework 6 с кодом First. У нас есть консольное приложение, которое не имеет ссылки на EntityFramework, но читает строку подключения из App.config. Он вызывает сборку DatabaseInitializationUtilities, передающую строку соединения в качестве параметра.Поставщик ADO.NET не найден провайдер Entity Framework с инвариантным именем «System.Data.SqlClient».

DatabaseInitializationUtilities имеет ссылку на EF6 (EntityFramework и EntityFramework.SqlServer). Его App.config это:

<?xml version="1.0" encoding="utf-8"?> 
    <configuration> 
    <configSections> 
     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_IAuthentication" /> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://localhost/SecurityServices/Authentication.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAuthentication" contract="SecurityService.IAuthentication" name="BasicHttpBinding_IAuthentication" /> 
     </client> 
     </system.serviceModel> 
     <entityFramework> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
      <parameters> 
       <parameter value="v11.0" /> 
      </parameters> 
     </defaultConnectionFactory> 
     <providers> 
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     </providers> 
     </entityFramework> 
    </configuration> 

Когда выполнение достигает линии, где DatabaseInitializationUtilities пытается запустить сценарий

context.Database.ExecuteSqlCommand(script.ScriptText) 

брошена ошибка:

Нет Entity Framework поставщик найдено для поставщик ADO.NET с инвариантным именем «System.Data.SqlClient». Убедитесь, что провайдер зарегистрирован в разделе «entityFramework» файла конфигурации приложения. См. http://go.microsoft.com/fwlink/?LinkId=260882 для получения дополнительной информации.

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

ПРИМЕЧАНИЕ.. Resharper является bluelining узел и отчетности «Элемент„EntityFramework“имеет„провайдеры“недопустимый дочерний элемент Однако участок был впрыскивается NuGet, когда я установил Ef6

Любые идеи

?
+0

Взгляните на следующий вопрос: http://stackoverflow.com/questions/14033193/entity-framework-provider-type-can-not-be-loaded – Lloyd

+0

Спасибо. Комментарий к [http://stackoverflow.com/questions/14033193/entity-framework-provider-type-could-not-be-loaded][1] был полезен. [1]: http://stackoverflow.com/questions/14033193/entity-framework-provider-type-could-not-be-loaded – Dewey

+1

Добавить EntityFramework.SqlServer.dll к клиентскому приложению и добавить connectionstrings в файл app.config сделал трюк. Теперь ошибка исчезла http://stackoverflow.com/questions/18455747/no-entity-framework-provider-found-for-the-ado-net-provider-with-invariant-name –

ответ

17

у вас есть узел EntityFramework.SqlServer.dll на своем пути приложения? Я была такая же проблема и после копирования DLL в папку приложения каждая вещь работала отлично.

+0

Я столкнулся с той же проблемой и исправил добавление EntityFramework.SqlServer.dll, который отсутствовал. –

+1

хорошая идея. вы спасли мое время. +1 –

+0

спасибо дорогой томас :) – Ali7091

48

Вам нужно создать ссылку, так он будет скопирован в папку отладки. позже он может быть доступен во время выполнения.

Не копировать любые файлы, просто создать эту ссылку:

private volatile Type _dependency; 

public MyClass() 
{ 
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices); 
} 
+0

И почему это так? – JwJosefy

+5

Эпическая победа! Причина, по которой он терпит неудачу, состоит в том, что только скопированные сборки непосредственно копируются. У этой сборки нет прямой ссылки, поэтому она не копируется. – briantyler

+10

Я думаю, что у команды EF есть некоторые объяснения, чтобы сделать это. – ProfK

13

Наконец нашел ответ в этом блоге:

http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html

+0

Yeo, это была проблема для меня тоже ... Я удалил всю базу данных и проверил решение с нуля, и после первой сборки я получил это точное " error massage ":-) Вместил неустойчивый рефренс, и он сработал. –

+0

Так почему бы не кратко упомянуть основную идею этого здесь? – Deilan

+0

@Deilan идея такая же, как и в dh_cgn answer http://stackoverflow.com/a/21531672/52277 –

5

я тоже была эта проблема. Все работало локально, когда я запускал мое .net-приложение mvc, но когда я его опубликовал, я получил эту ошибку. Проблема заключалась в том, что мне пришлось ссылаться на EntityFrameworl.SqlServer также в моем веб-проекте, хотя у меня был отдельный проект для Data. Странно, что эта ошибка была брошена только тогда, когда приложение было опубликовано. Это серьезная ошибка, вероятно, от Microsoft. Я использовал EF 6.1.1.

+0

У меня была такая же проблема. Моя ссылка на сборки ef находится в отдельном проекте данных, который ссылается на мой проект mvc. Я установил ef из nuget в проект mvc, переиздан и работал. Спасибо за исправление – Mike

2

Для меня оказалось, что ссылка поставщика в файле web.config неверна. Я считаю, что пакет nuget может неправильно включать поставщика.

я заменил мой провайдер с этим, и она работала:

<entityFramework> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
     <providers> 
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     </providers> 
    </entityFramework> 
4

Это происходит потому, что EntityFramework.SqlServer.dll не копируется в ваш проект. Добавьте эту dll, и она, надеюсь, будет работать. Вы можете найти это из проекта, где вы добавили datamodel.

0

Лучший способ получить такую ​​проблему - включить ссылку в EntityFramework.SqlServer.dll в свой проект, нажмите F4 (для свойств), изменив свойство на Copy to Local = True, поэтому каждый время публикации этого приложения будет скопировано в опубликованную папку.

0

Я обычно добавляю EntityFramework в веб-проект, а также сборку, которая на самом деле ссылается на нее.

0

Я также имел подобную проблему

Моя проблема была решена, выполнив следующие действия: enter image description here

enter image description here

Смежные вопросы