Я пытаюсь запустить свои тесты на 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 ... но, похоже, это тоже не работает.
Обновить
Мой 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>
Я получаю следующую трассировку стека в 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
источник
private volatile Type _dependency...
ответ, и он работал! Просто воняет, что мне нужно добавить отдельный класс, как этот, чтобы заставить EF работать в TeamCity.Ответы:
Та же проблема, но я установил EF 6 через Nuget. EntityFramework.SqlServer отсутствует для другого исполняемого файла. Я просто добавил пакет nuget в этот проект.
источник
x.ToString()
иначе она выйдетtypeof
в Release.У меня была та же проблема в моих тестовых проектах - я устанавливал последние биты EF6 через NuGet и каждый раз, когда я вызываю что-то, связанное с EF, я получаю:
Мой обходной путь: я поместил этот метод в свой тестовый проект:
Этот метод никогда не вызывался, но я думаю, что компилятор удалит все «ненужные» сборки и без использования материала EntityFramework.SqlServer тест не пройден.
В любом случае: работает на моей машине;)
Примечание: вместо добавления метода для тестирования проекта вы можете обеспечить статическую ссылку на SqlProviderServices из вашего проекта Model / entity .
источник
DbContext
класс решит проблему в EF 6.1. Таким образом, вам не нужно включать пакет Nuget Entity Framework в ваш интерфейсный проект (WebApi и т. Д.), И вы можете оставить все, что связано с EF, на вашем уровне данных.Nuget настроит ваш проект EF6 для ссылки на EntityFramework.SqlServer.dll. Он развертывается в выходной папке для вашего проекта EF6 во время сборки, но не развертывается в выходной папке для проектов, ссылающихся на ваш проект EF6. Я полагаю, что это потому, что Visual Studio достаточно «умен», чтобы обнаружить, что ничто в вашей сборке на самом деле не использует dll напрямую и поэтому не включает его. Вы можете принудительно развернуть EntityFramework.SqlServer.dll в выходной папке проектов, ссылающихся на ваш проект EF6 (модульные тесты, пользовательский интерфейс и т. Д.), Добавив код в ваш проект EF6, который использует EntityFramework.SqlServer.dll. Будьте осторожны, чтобы не помещать код в сгенерированный класс, так как вы рискуете потерять его при следующей регенерации. Я решил добавить следующий класс в сборку, которая устранила проблему.
источник
Мое решение состояло в том, чтобы удалить платформу сущностей из проекта с помощью диспетчера nuget и добавить ее обратно.
источник
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
Я решил это, добавив использование метки поверх моего класса DBContext, вот так:
источник
Я использовал регистрацию на основе кода для провайдера. link1 ссылка2
Просто создал класс конфигурации как
Ключевым моментом является SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
и использовал его таким образом
источник
DbContextConfiguration
? СпасибоGet-Project MyWinformsProject | Install-Package EntityFramework
которая исправила это для меня. Тем не менее, я хотел бы лучше понять причину.DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
.Я разобрался с [DeploymentItem] в моем классе инициализации сборки
источник
Опоздал на вечеринку, но ответы с самым высоким рейтингом показались мне взломами.
Все, что я сделал, это удалил следующее из моего app.config в тестовом проекте. Работал.
источник
У меня проблема, потому что я не добавляю ссылку на EntityFramework.sqlServer.dll. Когда я разрабатываю программу, она работает. Но когда я публикую приложение и устанавливаю его, оно выдает ошибку.
Я просто добавляю ссылку и снова создаю и публикую.
источник
Я решил это, вручную скопировав
EntityFramework.SqlServer.dll
файл вbin folder
основное приложение.источник
Я наконец решил это. Оказывается, у меня была ошибочная реализация IDIsposable в моем классе репозитория. Я исправил это. Ошибочная реализация вызвала исключение переполнения стека, поскольку я неправильно распределял ресурсы. Это привело к тому, что VS не запустил тесты, и механизм выполнения теста вышел из строя.
Я подал это в Microsoft здесь (это было до того, как я получил правильное решение). connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details
Во всяком случае, сборки теперь отлично работают в команде. Тем не менее, мне все еще любопытно, почему ни один из механизмов исполнения VS Test не мог изящно рассказать мне, что происходит, а не Team City.
Я обнаружил основную причину, отладив тест вручную (что я понял только через столько дней, исправление заняло у меня 5 секунд).
Надеюсь, это поможет кому-то, кто сталкивается с такими проблемами.
источник
Я вижу аналогичную проблему и использую метод из этого поста: ( http://entityframework.codeplex.com/workitem/1590 ), который решает мою проблему.
Чтобы обойти эту проблему, вы можете сделать так, чтобы ваша тестовая сборка напрямую ссылалась на сборку поставщика, добавив такую строку в любом месте тестовой сборки: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
источник
Когда я проверил проблему, я заметил, что в папке вывода отсутствовали следующие dll. Простое решение - скопировать Entityframework.dll и Entityframework.sqlserver.dll с app.config в выходную папку, если приложение находится в режиме отладки. В то же время измените параметр сборки «Копировать в выходную папку» в app.config, чтобы всегда копировать. Это решит вашу проблему.
источник
Просто ссылка или браузер EF DLL - EntityFramework.SqlServer.dll
источник
У меня была одна и та же проблема, которую я пробовал много раз, но она не разрешилась, но когда я установил пакет EntityFramework.SqlServerCompact, он решил установить этот пакет из диспетчера пакетов Nuget.
источник
Я создал статический файл «запуска» и добавил код для принудительного копирования библиотеки DLL в папку bin в ней, чтобы отделить эту «конфигурацию».
[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }
источник
Я не хотел ссылаться на EF в своем проекте приложения (или что-либо копировать вручную), поэтому я добавил это в события Post-build моего проекта EF:
источник
Это происходит только внутри моих проектов нагрузочного / модульного тестирования. Расстраиваюсь, я просто столкнулся с этим в проекте, которым управляю уже 2 года. Должен быть какой-то порядок пробного запуска, который ломает вещи. Я думаю, однажды, когда фантастика будет удалена, она исчезнет.
Я обнаружил, что просто объявление переменной, которая использует правильное значение, решает проблему ... Я никогда даже не вызывал метод. Просто определите это. Странно, но это работает.
источник
Попробовав все предложенные решения и не заставив мой проект работать, я наконец нашел небольшой комментарий на этой странице :
И это сработало для меня тоже.
источник
Добавление Entityframework.dll и Entityframework.sqlserver.dll к базовому проекту решило проблему.
источник
Я проверил окно вывода отладки в проекте модульного теста. EntityFramework.SqlServer.dll не был загружен. После добавления его в папку bin тесты были успешно выполнены.
источник
У меня тоже была похожая проблема
Моя проблема была решена с помощью следующих действий:
источник
У меня была такая же проблема с
DBContext
объектом Instantiating из проекта модульного тестирования. Я проверил свои пакеты проектов модульного теста и понял, чтоEntityFramework
пакет не был установлен, я установил его из Nuget, и проблема решена (я думаю, что это ошибка EF).счастливое кодирование
источник
У меня было такое же сообщение об ошибке.
У меня есть отдельный проект для доступа к данным. Запуск веб-проекта (который ссылался на проект данных) локально работал просто отлично. Но когда я развернул веб-проект для лазирования сборки: EntityFramework.SqlServer не был скопирован. Я просто добавил ссылку на веб-проект и развернул ее, теперь она работает.
надеюсь, это поможет другим
источник
Я работал над учебником Contoso University в автономном режиме и столкнулся с той же проблемой, когда пытался создать свой первый контроллер с помощью EF. Мне пришлось использовать консоль диспетчера пакетов, чтобы загрузить EF из кэша nuget и создать строку подключения к моему локальному экземпляру SQL Server. Моя точка зрения заключается в том, что мой параметр webConfig для EF может быть не таким, как все вы, но я смог чтобы решить мою проблему, полностью удалив раздел «провайдеры» в «entityFramework»
Роберт
источник
Это легко исправить. откройте ссылки в вашем проекте, щелкните правой кнопкой мыши «System.Data» -> свойства. Измените «Копировать локально» на «Истина».
Проблема должна быть исправлена.
источник
В моем случае я решил проблему, установив SQL Server 2012 Developer Edition, когда я ранее установил SQL Server Express 2012 (x64). Кажется, это дало мне недостающую зависимость.
источник
удалите структуру сущностей из проекта через Nuget, а затем добавьте ее обратно.
источник
В моем случае
dll
не было скопировано, хотя я добавил ссылку на него. Это потому чтоEntityFramework.SqlServer.dll
не копируется в ваш проект. Добавьте эту DLL, и она, надеюсь, сработает. Вы можете найти это в проекте, где вы добавили модель данных.источник
В дополнение ко всем полезным советам, если вы используете EF 6.1.3, убедитесь, что версия вашего проекта .net версии 4.5 или более.
источник