[C#] 엔티티 프레임 워크 제공자 유형을로드 할 수 없습니까?

현재 내 컴퓨터에 설치된 TeamCity에서 테스트를 실행하려고합니다.

System.InvalidOperationException:

System.Data.Entity.SqlServer.SqlProviderServices,
EntityFramework.SqlServer
Version=6.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089'
대한 Entity Framework 제공자 유형 ‘System.Data.SqlClient ‘ADO.NET 제공자에 로드 할 수 없습니다. 실행중인 응용 프로그램에서 공급자 어셈블리를 사용할 수 있는지 확인하십시오.

자세한 내용은 http://go.microsoft.com/fwlink/?LinkId=260882 를 참조하십시오.

나는 언급이 없다 System.Data.EntityEF6으로 업그레이드하기 위해 codeplex에서 제안한대로 프로젝트에 대한 .

따라서 왜이 예외가 발생하는지 잘 모르겠습니다. 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



답변

같은 문제이지만 Nuget을 통해 EF 6을 설치했습니다. 다른 실행 파일에 대한 EntityFramework.SqlServer가 누락되었습니다. 그 프로젝트에 너겟 패키지를 추가했습니다.


답변

테스트 프로젝트에서 같은 문제가 발생했습니다. NuGet을 통해 최신 EF6 비트를 설치했으며 EF 관련 항목을 호출 할 때마다 다음과 같은 문제가 발생했습니다.

‘System.Data.SqlClient’ADO.NET 제공자에 대한 Entity Framework 제공자 유형 ‘System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer’를로드 할 수 없습니다. 실행중인 응용 프로그램에서 공급자 어셈블리를 사용할 수 있는지 확인하십시오. 자세한 내용은
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 항목을 사용하지 않고 모든 “필요하지 않은”어셈블리를 제거한다고 생각합니다.

어쨌든 : 내 컴퓨터에서 작동;)

참고 : 프로젝트를 테스트하기 위해 메소드를 추가하는 대신 Model / entity 프로젝트에서 SqlProviderServices에 대한 정적 참조를 보장 할 수 있습니다 .


답변

Nuget은 EntityFramework.SqlServer.dll을 참조하도록 EF6 프로젝트를 구성합니다. 빌드하는 동안 EF6 프로젝트의 출력 폴더에 배치되지만 EF6 프로젝트를 참조하는 프로젝트의 출력 폴더에는 배치되지 않습니다. Visual Studio는 어셈블리의 아무것도 실제로 dll을 직접 사용하고 있지 않으므로 감지하지 않을 정도로 “스마트”하기 때문이라고 생각합니다. EntityFramework.SqlServer.dll을 사용하는 EF6 프로젝트에 코드를 추가하여 EF6 프로젝트 (단위 테스트, UI 등)를 참조하는 프로젝트의 출력 폴더에 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;
}


답변

내 솔루션은 너겟 관리자를 통해 프로젝트에서 엔티티 프레임 워크를 제거하고 다시 추가하는 것이 었습니다.


답변

DBContext 클래스 위에 using stament를 추가 하여이 문제를 해결했습니다.

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);
    }
}

요점은 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)
    {
        ...
    }
}


답변

어셈블리 초기화 클래스에서 [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());
        }
    }
}