Не удалось загрузить тип поставщика Entity Framework?

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

System.InvalidOperationException:

Тип поставщика Entity Framework 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' для' System.Data.SqlClient ' Поставщик ADO.NET не может быть загружен. Убедитесь, что узел поставщика доступна для запуска приложения.

Подробнее см. http://go.microsoft.com/fwlink/?LinkId=260882. информация..

У меня нет ссылки на System.Data.Entity в любом из моих проектов, как было предложено в кодексе для перехода на EF6.

Итак, я не уверен, почему я получаю это исключение. Я не получаю такого исключения, когда я запускаю тесты из VS.

Я попытался установить CopyLocal на false, а затем на true.. но это тоже не работает.

Обновить

У моего app.config есть следующее. Означает ли это какое-то поведение, которое я не понимаю?

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

Я получаю следующую команду stacktrace в teamcity.

[MSTest] IntegrationTests.CrudTest+QuestionTest.Create
[03:59:11][IntegrationTests.CrudTest+QuestionTest.Create] Initialization method IntegrationTests.CrudTest+QuestionTest.Initialize threw exception. System.InvalidOperationException: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. Make sure the provider assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information..
[03:59:11]
[IntegrationTests.CrudTest+QuestionTest.Create]     at System.Data.Entity.Config.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName)
   at System.Data.Entity.Config.ProviderServicesFactory.GetInstanceByConvention(String providerInvariantName)
   at System.Data.Entity.Config.DefaultProviderServicesResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.CachingDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 k)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Data.Entity.Config.CachingDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.RootDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.CompositeResolver`2.GetService(Type type, Object key)
   at System.Data.Entity.Config.IDbDependencyResolverExtensions.GetService[T](IDbDependencyResolver resolver, Object key)
   at System.Data.Entity.Config.InternalConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Config.DbConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Utilities.DbProviderFactoryExtensions.GetProviderServices(DbProviderFactory factory)
   at System.Data.Entity.Infrastructure.DefaultManifestTokenService.GetProviderManifestToken(DbConnection connection)
   at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at EFRepository.Infrastructure.EFRepository`1.Add(T item) in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\Repository\Infrastructure\EFRepository.cs:line 22
   at IntegrationTests.CrudTest.Initialize() in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\IntegrationTests\CrudTest.cs:line 34

Ответ 1

Такая же проблема, но я установил EF 6 через Nuget. EntityFramework.SqlServer отсутствовал для другого исполняемого файла. Я просто добавил пакет nuget к этому проекту.

Ответ 2

У меня была та же проблема в моих тестовых проектах - я установил последние биты EF6 через NuGet, и каждый раз, когда я вызываю что-то связанное с EF, я получил:

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

Мое обходное решение: я поместил этот метод в свой тестовый проект:

public void FixEfProviderServicesProblem()
{
//The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
//for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
//Make sure the provider assembly is available to the running application. 
//See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

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

В любом случае: работает на моей машине;)

Примечание: Вместо добавления метода для тестирования проекта вы можете обеспечить статическую ссылку на SqlProviderServices из вашего проекта Model/entity.

Ответ 3

Nuget настроит ваш проект EF6 на ссылку EntityFramework.SqlServer.dll. Это развертывается в выходной папке для вашего проекта EF6 во время сборки, но не будет развертываться в выходной папке для проектов, ссылающихся на ваш проект EF6. Я считаю, что это потому, что Visual Studio достаточно "умна", чтобы обнаружить, что ничто в вашей сборке фактически не использует DLL и поэтому не включает ее. Вы можете заставить EntityFramework.SqlServer.dll быть развернутым в выходной каталог проектов, ссылающихся на ваш проект EF6 (модульные тесты, пользовательский интерфейс и т.д.), Добавив код в ваш проект EF6, который использует EntityFramework.SqlServer.dll. Будьте осторожны, чтобы не поместить код в сгенерированный класс, поскольку вы рискуете потерять его на следующем регенере. Я решил добавить в сборку следующий класс, который устранил проблему.

using System.Data.Entity.SqlServer;

internal static class MissingDllHack
{
    // Must reference a type in EntityFramework.SqlServer.dll so that this dll will be
    // included in the output folder of referencing projects without requiring a direct 
    // dependency on Entity Framework. See http://stackoverflow.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

Ответ 4

Мое решение состояло в том, чтобы удалить инфраструктуру сущности из проекта через диспетчер nuget и добавить его обратно.

Ответ 5

Я решил это, добавив использование stament поверх моего класса DBContext, например:

using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;

Ответ 6

Я использовал регистрацию на основе кода для провайдера. link1 link2

Просто создал класс конфигурации, например

class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

Ключевые моменты this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);

и использовал его таким образом

[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

    public DbSet<...> ...{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}

Ответ 7

Я отсортировал его с помощью [DeploymentItem] в моем классе инициализации сборки

namespace MyTests
{
    /// <summary>
    /// Summary description for AssemblyTestInit
    /// </summary>
    [TestClass]
    [DeploymentItem("EntityFramework.SqlServer.dll")]
    public class AssemblyTestInit
    {
        public AssemblyTestInit()
        {
        }

        private TestContext testContextInstance;

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [AssemblyInitialize()]
        public static void DbContextInitialize(TestContext testContext)
        {
            Database.SetInitializer<TestContext>(new TestContextInitializer());
        }
    }
}

Ответ 8

Поздно к вечеринке, но верхние голосовые ответы все мне показались для меня.

Все, что я сделал, это удалить из моего приложения app.config в тестовом проекте. Работали.

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

Ответ 9

У меня проблема, потому что я не добавляю ссылку на EntityFramework.sqlServer.dll. Когда я разрабатываю программу, она работает. Но когда я публикую приложение и устанавливаю его, он выдает ошибку.

Я просто добавляю ссылку, строю и публикую снова.

References

Ответ 10

Я наконец решил это. Оказывается, у меня была ошибочная реализация IDIsposable в моем классе репозитория. Я это исправил. Ошибочная реализация вызвала исключение stackoverflow, поскольку я не выбрал ненужные ресурсы. Это привело к тому, что VS не запускал тесты, и механизм выполнения теста разбился.

Я подал его в Microsoft здесь (это было до того, как я получил правильное решение). connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

В любом случае, сборки теперь отлично работают на teamcity. Хотя, мне все еще интересно, почему ни один из двигателей выполнения VS Test не имел изящного способа сообщить мне, что происходит, а не Team City.

Я обнаружил основную причину, вручную отлаживая тест (который я понял только через несколько дней, исправление заняло у меня 5 секунд).

Надеюсь, это поможет кому-то, кто сталкивается с такими проблемами.

Ответ 11

Я вижу подобную проблему и использую метод из этого сообщения: (http://entityframework.codeplex.com/workitem/1590), который решает мою проблему.

Чтобы обойти проблему, вы можете сделать свою тестовую сборку напрямую ссылкой на сборку поставщика, добавив некоторую строку, как это в любом месте тестовой сборки: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

Ответ 12

Я решил это, вручную скопировав EntityFramework.SqlServer.dll файл в bin folder основного приложения.

Ответ 13

Когда я осмотрел проблему, я заметил, что в выходной папке отсутствовали следующие DLL. Простым решением является копирование Entityframework.dll и Entityframework.sqlserver.dll с приложением app.config в выходную папку, если приложение находится в режиме отладки. В то же время измените параметр опции "Скопировать в папку вывода" app.config для копирования всегда. Это решит вашу проблему.

Ответ 14

Просто ссылку или браузер EF dll - EntityFramework.SqlServer.dll

Ответ 15

У меня был такой же isssue, я много раз пробовал, но он не разрешался, но когда я устанавливал пакет EntityFramework.SqlServerCompact, он решил установить этот пакет из Nuget Package Manager.

Install-Package EntityFramework.SqlServerCompact

Ответ 16

Мне не нужна ссылка на EF в моем проекте приложения (или вручную копировать что-либо), поэтому я добавил это в свой проект EF. События после сборки:

cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}

Ответ 17

Это происходит только в моих проектах нагрузочного/модульного тестирования. Разочаровавшись, я знал, что это произошло в проекте, в котором я работал 2 года. Должно быть, был какой-то порядок тестирования, который ломает ситуацию. Думаю, когда-то это удалит его.

Я обнаружил, что просто объявление переменной, использующей правильное значение, устраняет проблему... Я даже не вызываю метод. Просто определите это. Нечетный, но он работает.

    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }

Ответ 18

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

Удаление BIN-папки сделало это для меня

И это сработало для меня тоже.

Ответ 19

Добавление Entityframework.dll и Entityframework.sqlserver.dll к эталонному проекту решило проблему.

Ответ 20

Я проверил окно вывода Debug в проекте Unit Test. EntityFramework.SqlServer.dll не был загружен. После добавления его в папку bin тесты были успешно запущены.

Ответ 21

У меня также была аналогичная проблема

Моя проблема была решена путем выполнения следующих действий:

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

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

Ответ 22

Я создал статический файл "запуска" и добавил код, чтобы принудительно скопировать DLL в папку bin в ней, чтобы отделить эту "конфигурацию".


[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }

 public class DbContextConfiguration: DbConfiguration { public DbContextConfiguration() {//This is needed to force the EntityFramework.SqlServer DLL to be copied to the bin folder SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance); } }

Ответ 23

У меня просто было то же сообщение об ошибке.

У меня есть отдельный проект для доступа к данным. Запуск веб-проекта (который ссылался на проект данных) локально работал просто отлично. Но когда я развернул веб-проект для оформления сборки: EntityFramework.SqlServer не был скопирован. Я просто добавил ссылку на веб-проект и перераспределен, теперь он работает.

надеюсь, что это поможет другим

Ответ 24

Я работал над учебным пособием Университета Contoso в автономном режиме и столкнулся с той же проблемой при попытке создать мой первый контроллер с использованием EF. Мне пришлось использовать консоль диспетчера пакетов для загрузки EF из кеша nuget и создать строку подключения для моего локального экземпляра SQL Server, моя точка зрения заключается в том, что мой параметр webConfig для EF не может быть установлен так, как вы все там, но я был в состоянии для решения моей проблемы, полностью удалив раздел "поставщики" в разделе "entityFramework"

Роберт

Ответ 25

Есть легкое исправление. откройте ссылки в своем проекте, щелкните правой кнопкой мыши "System.Data" → свойства. Измените "Скопировать локальный" на "True".

Проблема должна быть исправлена.

Ответ 26

В моем случае я решил проблему, установив SQL Server 2012 Developer Edition, когда ранее устанавливал SQL Server Express 2012 (x64). Кажется, что предоставил мне недостающую зависимость.

Ответ 27

удалите инфраструктуру сущности из проекта с помощью nuget, затем добавьте его обратно.

Ответ 28

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

Ответ 29

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

Ответ 30

В моем случае проблема заключалась в том, что для того, чтобы поймать другое исключение, я включил исключения CLR (Common Language runtime). И я забыл отключить его.

Я отключил его в настройках исключения. и он упустил это исключение и продолжил работать и создал для меня db (в моем случае) автоматически.