Programming

고정 이름이 'System.Data.SqlClient'인 ADO.NET 제공자에 대한 Entity Framework 제공자를 찾을 수 없습니다.

procodes 2020. 2. 11. 22:41
반응형

고정 이름이 'System.Data.SqlClient'인 ADO.NET 제공자에 대한 Entity Framework 제공자를 찾을 수 없습니다.


nuget으로 EF6을 다운로드하고 프로젝트를 실행하려고하면 다음 오류가 반환됩니다.

이름이 'System.Data.SqlClient'인 ADO.NET 제공자에 대한 Entity Framework 제공자를 찾을 수 없습니다. 제공자가 애플리케이션 구성 파일의 'entityFramework'섹션에 등록되어 있는지 확인하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkId=260882 를 참조하십시오.

여기에 이미지 설명을 입력하십시오


방금 동일한 문제가 발생했으며 NuGet Package Manager에서 설치했지만 프로젝트에 올바르게 설치되지 않았지만 EntityFramework처럼 보입니다.

패키지 관리자 콘솔 에서 다음 명령을 실행하여 문제를 해결했습니다 .

PM> Install-Package EntityFramework

클래스 라이브러리 프로젝트에 EF를 추가했습니다. 또한이를 참조하는 프로젝트 (콘솔 앱, 웹 사이트 등)에 추가해야합니다.


콘솔 응용 프로그램에 Entity Framework를 설치할 필요가 없으며 어셈블리 EntityFramework.SqlServer.dll에 대한 참조 만 추가하면됩니다. Entity Framework를 사용하는 클래스 라이브러리 프로젝트에서이 어셈블리를 LIB 폴더로 복사하고 이에 대한 참조를 추가 할 수 있습니다.

요약해서 말하자면:

  • 클래스 라이브러리 응용 프로그램 :
    • 엔터티 프레임 워크 설치
    • 데이터 레이어 코드 작성
    • app.config 파일에는 연결 문자열을 제외하고 Entity Framework와 관련된 모든 구성이 있습니다.
  • 콘솔, 웹 또는 데스크탑 애플리케이션을 작성하십시오.
    • 첫 번째 프로젝트에 대한 참조를 추가하십시오.
    • EntityFramework.SqlServer.dll에 대한 참조를 추가하십시오.
    • app.config / web.config에는 연결 문자열이 있습니다 (구성 항목의 이름은 DbContext 클래스의 이름과 같아야 함을 기억하십시오).

도움이 되길 바랍니다.


"EntityFramework.SqlServer.dll"포함 하지 않은 경우 에도이 메시지가 표시 될 수 있습니다 .

EF6에 새로 추가 된 파일 인 것 같습니다. 처음에는 병합 모듈에 포함시키지 않고 여기에 나열된 문제가 발생했습니다.


프로젝트를 호스팅하기 위해 EntityFramework.SqlServer를 추가하는 대신 다음과 같은 모델 / 엔티티 프로젝트에서 정적 참조를 확인할 수 있습니다.

static MyContext()
{
    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");
}

이렇게하면 빌드 프로세스에 호스트 프로젝트와의 어셈블리가 포함됩니다.

내 블로그 http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/ 에 대한 추가 정보


언제 통해 엔티티 프레임 워크 (6)를 설치합니다 Nuget. EntityFramework.SqlServer는 때때로 다른 실행 파일이 누락되었습니다. Nuget해당 프로젝트에 패키지를 추가하기 만하면 됩니다.

때때로 위의 테스트 프로젝트에서 작동하지 않습니다

테스트 프로젝트에서이 문제를 해결하려면이 메소드를 테스트 프로젝트 안에 넣으십시오.

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

이 메소드는 결코 호출되지 않았지만, 관찰 한 바와 같이 컴파일러는 모든 "불필요한"어셈블리를 제거 EntityFramework.SqlServer하고 테스트에 실패한 것을 사용하지 않습니다.


이 기능 추가

private void FixEfProviderServicesProblem()

라이브러리 클래스의 데이터베이스 컨텍스트 클래스에 누락 된 DLL EntityFramework.SqlServer.dll이 올바른 위치로 복사됩니다.

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

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

.


이 중 어느 것도 나를 위해 일하지 않았습니다. 또 다른 stackoverflow 질문 에서 해결책을 찾았습니다 . 쉽게 참조 할 수 있도록 여기에 추가하겠습니다.

참조가 필요하므로 응용 프로그램 경로에 복사됩니다. 나중에 런타임에서 참조되기 때문입니다. 따라서 파일을 복사 할 필요가 없습니다.

private volatile Type _dependency;

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

SQL Server Compact 4.0에서 Entity Framework 6을 사용하는 동안 동일한 오류가 발생했습니다. EF6 Entity Framework ProvidersMSDN에 대한 기사 가 도움이되었습니다. 패키지 관리자 콘솔에서 각각의 공급자 명령을 너겟 패키지로 실행하면 NuGet 패키지가 구성 파일에 자동으로 등록을 추가하므로 문제를 해결할 수 있습니다. 나는 PM> Install-Package EntityFramework.SqlServerCompact문제를 해결하기 위해 달려 갔다 .


테스트 프로젝트에서 오류가 발생하면 가장 좋은 해결책은 다음과 같이 테스트 클래스를 장식하는 것입니다.

[DeploymentItem("EntityFramework.SqlServer.dll")]

각각 다른 프로젝트의 웹 서비스 세트와 해당 서비스 중 일부에 대한 통합 테스트를 포함하는 별도의 프로젝트로 작업 할 때이 문제에 부딪치게되었습니다.

통합 테스트 프로젝트에서 EF에 대한 참조를 포함 할 필요없이 EF5와 함께이 설정을 사용하고 있습니다.

이제 EF6으로 업그레이드 한 후 통합 테스트 프로젝트에 EF6에 대한 참조를 포함시켜야하지만 (위에서 user3004275가 지적한 것처럼) 사용하지 않아도됩니다 .

같은 문제에 직면하고있는 징후 :

  • EF6에 대한 참조가있는 프로젝트에서 시작된 경우 EF에 직접 호출 (DB에 연결, 데이터 가져 오기 등)이 제대로 작동합니다.
  • 게시 된 서비스 인터페이스를 통한 서비스 호출은 정상적으로 작동합니다. 즉, 서비스에 "내부적으로"누락 된 참조가 없습니다.
  • 서비스 외부 프로젝트에서 서비스 프로젝트의 공용 메소드직접 호출 하면 해당 프로젝트 자체에서 EF가 사용되지 않더라도이 오류가 발생합니다. 호출 된 프로젝트에서만 내부적으로

세 번째 요점은 잠시 동안 나를 버린 것인데 왜 이것이 이것이 필요한지 잘 모르겠습니다. 통합 테스트 프로젝트에서 EF6에 참조를 추가하면 어쨌든 해결되었습니다 ...


나는 오늘이 문제에 부딪쳤다. 테스트를 위해 EF63 NuGet 패키지 및 콘솔 응용 프로그램이있는 데이터 저장소 클래스 라이브러리가 있으며 클래스 라이브러리 프로젝트에만 참조됩니다. 클래스 라이브러리의 Bin \ Debug 폴더에서 콘솔 응용 프로그램의 Bin \ Debug 폴더로 EntityFramework.SqlServer.dll을 복사하여 문제를 해결하는 매우 간단한 빌드 후 명령을 만들었습니다. entityFramework 섹션을 콘솔 애플리케이션의 .config 파일에 추가하는 것을 잊지 마십시오.


Entity Framework가 사용되는 프로젝트를 참조하는 시작 프로젝트는 bin 폴더에 다음 두 개의 어셈블리가 필요합니다.

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

시작 프로젝트에서 .config 파일에 <section>추가하면 <configSections>해당 bin 디렉토리에서 첫 번째 어셈블리를 사용할 수 있습니다. 이것을 Entity Framework 프로젝트의 .config 파일에서 복사 할 수 있습니다.

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

bin 폴더에서 두 번째 .dll을 사용할 수 있도록하려면 실용적이지는 않지만 Entity Framework 프로젝트의 bin 폴더에서 수동으로 복사 할 수 있습니다. 더 나은 대안은 Entity Framework 프로젝트의 빌드 후 이벤트에 다음 행을 추가하여 프로세스를 자동화하는 것입니다.

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\

BIN 폴더를 삭제하면 나를 위해 그것을했습니다


app.config에 아래를 추가하십시오.

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

EntityFramework.SqlServer.dll 어셈블리에 대한 정적 참조를 강제 실행해야 하지만 더미 코드를 넣는 대신보다 아름다운 방법으로이를 수행 할 수 있습니다.

  1. 이미 DbConfiguration 클래스 가있는 경우 :

    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        }
    }
    
  2. DbConfiguration 클래스 가없는 경우 앱 시작시 (EF를 사용하기 전에) 다음 코드를 넣어야합니다.

    static MyContext()
    {
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
    

Nuget을 사용하여 Entity Framework를 다시 설치했습니다. 그리고 아래 링크에 작성된 지침을 따르십시오 : http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

문제가 해결 될 것 같아요.


YourModel.edmx 파일을 펼치고 YourModel.Context.tt에서 YourModel.Context.cs 클래스를여십시오.

using 섹션에 다음 줄을 추가하고 오류가 수정되었습니다.

SqlProviderServices 사용 = System.Data.Entity.SqlServer.SqlProviderServices;

파일이 자동 생성 될 때마다 파일에이 줄을 추가해야 할 수도 있습니다.


비슷한 문제가 있었는데, 다음과 같은 방법으로 문제를 해결했습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


System.Data.SqlClient가 시스템에 설치되어 있고 참조가 있는지 먼저 확인한 사람은 없습니다.

System.Data.SqlClient를 설치하고 app.Config에서 새 공급자를 추가하여 문제를 해결했습니다.

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>

또한 시작 프로젝트가 dbcontext (또는 관련 app.config)가 포함 된 프로젝트인지 확인하십시오. Mine은 필요한 모든 구성 설정이없는 웹 사이트 프로젝트를 시작하려고했습니다.


나는 위의 거의 모든 것을 시도했지만 아무것도 효과가 없었습니다.

나는 기본 프로젝트에 참조 된 DLL을 설정 한 경우에만 EntityFrameworkEntityFramework.SqlServer등록 Copy Local하는 True이 작업을 시작 않았다!


모두 두 개의 dll EntityFramework.dll 및 EntityFramework.SqlServer.dll이 DataAccess 계층 라이브러리이며주의하여보기 또는 다른 계층에서 사용하는 것이 논리적이지 않다는주의가 필요합니다. 문제를 해결하지만 논리적이지 않습니다.

논리적 인 방법은 enitys 속성을 제거하고 Fluent API로 대체하는 것입니다.


하나의 콘솔 응용 프로그램과 클래스 라이브러리가 있습니다. 클래스 라이브러리에서 엔티티 데이터 모델을 생성하고 (클래스 라이브러리> 추가> 새 항목> 데이터> ADO.NET 엔티티 데이터 모델 6.0으로 마우스 오른쪽 버튼을 클릭) 콘솔 응용 프로그램에 참조를 넣습니다. 따라서 클래스 라이브러리에 대한 참조가있는 콘솔 응용 프로그램과 EF 모델이있는 클래스 라이브러리 내부가 있습니다. 테이블에서 일부 레코드를 가져 오려고 할 때도 같은 오류가 발생했습니다.

다음 단계에 따라이 문제를 해결했습니다.

  1. 솔루션을 마우스 오른쪽 버튼으로 클릭하고 '솔루션 용 NuGet 패키지 관리'옵션을 선택하면 NuGet 패키지 관리자 창이 나타납니다.
  2. '설치된 패키지'아래의 '관리'옵션으로 이동하십시오. 팁 : Entity Framework가 클래스 라이브러리에 추가되므로 '설치된 패키지'아래에 EntityFramework가 있으며 '관리'옵션이 표시됩니다.
  3. '관리'옵션을 클릭하고 EF 모델을 보유한 클래스 라이브러리에 대한 참조가있는 프로젝트에 패키지 설치를 확인하십시오 (제 경우에는 EF 모델이있는 클래스 라이브러리에 대한 참조가있는 콘솔 앱에 패키지를 설치하도록 확인란을 설정했습니다)

그게 내가해야 할 일이며 모든 것이 완벽하게 작동했습니다.

도움이 되었기를 바랍니다.


같은 오류가 있습니다. dbContext를 사용하여 모델에 쿼리하거나 다음과 같은 목록을 얻을 때마다 발생하는 것이 이상합니다.

var results = _dbContext.MyModel.ToList();

Entity Framework를 다시 설치하려고 시도했지만 제대로 참조했지만 아무 소용이 없습니다.

운 좋게도 Nuget에서 ALL솔루션 을 확인한 다음 everything웹 프로젝트에서 두 프로젝트의 EF 버전이 서로 다르므로 모든 것을 업데이트하거나 동일한 버전 인지 확인 했습니다. 그리고 작동합니다. 오류가 사라졌습니다.

모든 솔루션에서 Nuget을 관리하는 방법에 대한 스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


CE db에서 Azure의 Sql Server로 마이그레이션 할 때 관련 문제가있었습니다. 이 문제를 해결하기 위해 4 시간을 낭비했습니다. 잘만되면 이것은 누군가에게 비슷한 운명을 구할 수 있습니다. 나를 위해, packages.config 파일에서 SqlCE에 대한 참조가있었습니다. 그것을 제거하면 전체 문제가 해결되고 마이그레이션을 사용할 수있었습니다. 불필요하게 복잡한 설정 및 구성 문제가있는 다른 기술에 대해서는 Microsoft가 필요합니다.


I had the same issue, just copied the App Config file from the project that contained the DBContext to my test project


I had the identical exception thrown. I included

using System.Data; 
using System.Data.Entity;

and everything is back to working again ..


As message shows that we need to add provider System.Data.SqlClient that's why we need to install nuget package of EntityFramework that has two dll but if we are developing only console application then we just need to add reference of EntityFramework.SqlServer.dll


참고 : Model에서 Database Sql을 생성하는 동안이 문제가 발생했습니다. 모든 테이블을 잘 만들었지 만 변경 사항을 내 보내지 않습니다. 주목해야 할 것은 DDL 생성 템플릿을 SSDLtoSQL10으로 사용하여 SQL을 내보내려고 할 때이 오류가 발생한다는 것입니다. 여기에 MySQL 연결이 필요하므로 모델 특성의 DDL 생성 템플리트 SSDLtoMySQL 드롭 다운에서 선택하십시오. 이것에 하루 종일 보냈다!

참고 URL : https://stackoverflow.com/questions/18455747/no-entity-framework-provider-found-for-the-ado-net-provider-with-invariant-name



반응형