Не удалось загрузить тип поставщика 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 в любом из моих проектов, как было предложено на codeplex для обновления до EF6.

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

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

обновление

Мои приложения.конфигурация имеет следующие . Это вызывает какое-то поведение, которое я не понимаю ?

<?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>

I получите следующий 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:TeamCitybuildAgentworkda2ea4e72c0e77f0RepositoryInfrastructureEFRepository.cs:line 22
   at IntegrationTests.CrudTest.Initialize() in c:TeamCitybuildAgentworkda2ea4e72c0e77f0IntegrationTestsCrudTest.cs:line 34

30 ответов


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


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

тип поставщика Entity Framework - Система.Данные.Сущность.От SQLServer.SqlProviderServices, И EntityFramework.SqlServer " для " системы.Данные.ADO.NET в 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 из проекта модели / сущности.


Nuget настроит ваш проект EF6 для ссылки на EntityFramework.От SQLServer.файл DLL. Он развертывается в выходной папке для проекта EF6 во время сборки, но не будет развертываться в выходной папке для проектов, ссылающихся на проект EF6. Я считаю, что это потому, что Visual Studio достаточно "умна", чтобы обнаружить, что ничто в вашей сборке фактически не использует dll напрямую и поэтому не включает его. Вы можете заставить EntityFramework.От SQLServer.dll для развертывания в выходной папке проекты, ссылающиеся на ваш проект EF6 (модульные тесты, UI и т. д.) путем добавления кода в проект 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;
}

моим решением было удалить entity framework из проекта через менеджер nuget и добавить его обратно.


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

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

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

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

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

ключевой момент-это этого.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Экземпляр);

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

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

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

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

Я разобрался с [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());
        }
    }
}

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

все, что я сделал, это удалить следующее из моего приложения.конфигурации в тестовом проекте. Работал.

  <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>

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

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

References


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

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

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

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

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


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

чтобы обойти проблему, вы можете сделать тестовую сборку непосредственно ссылаться на сборку поставщика, добавив такую строку в любом месте тестовой сборки: var _ = система.Данные.Сущность.От SQLServer.SqlProviderServices.Пример;


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


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


просто ссылка или браузер dll - EntityFramework EF.От SQLServer.dll файлы


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

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

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

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

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

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

Install-Package EntityFramework.SqlServerCompact

Я проверил окно вывода отладки в проекте модульного теста. И EntityFramework.От SQLServer.dll не была загружена. После добавления его в папку bin тесты были успешно выполнены.


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

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

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

теперь я не могу сказать, нужно ли вам просто удалить папку bin, и она уже будет работать, или сначала вам придется делать то, что предложили другие разработчики, но дело в том, что я только получил его работу после удаления папки bin, и это после 3 или более часов поиска и tryinig других решений. Так что, возможно, это сработает и для тебя.


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

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

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


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

Роберт


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

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


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


Добавление Entityframework.DLL и и EntityFramework.от SQLServer.dll для справочного проекта решил проблему.


удалите Entity framework из проекта через nuget, затем добавьте его обратно.


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


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


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

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


убедитесь, что EntityFramework.dll, EntityFramework.От SQLServer.dll и dll вашего поставщика (для SQL Server Compact это будет EntityFramework.SqlServerCompact.dll) находятся в папке развернутого приложения. Это особенно важно для развернутого приложения.


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

моя проблема была решена следующим образом:

enter image description here

enter image description here