왜 EF7은 ASP.net Identity가 동일한 DbContext로 잘 작동 할 때 공급자를 구성하지 않았다고 말합니까?

asp.net-core c# ef-code-first entity-framework-core

문제

ASP.net 5, MVC6 및 Entity Framework 7을 사용하여 실험 프로젝트를 시작했습니다. ASP.Net Identity가 제대로 작동하지만 내 자신의 데이터 중 일부를 DbContext에 추가하고이 문제를 해결하려고했습니다. EF7 보고서 :

요청을 처리하는 중 처리되지 않은 예외가 발생했습니다.

InvalidOperationException : 데이터베이스 공급자가 구성되어 있지 않습니다. DbContext 클래스의 OnConfiguring 또는 서비스 설정시 AddDbContext 메서드를 재정 의하여 데이터베이스 공급자를 구성합니다.

Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices (ServiceProviderSource providerSource) 스택 쿼리 쿠키 헤더

InvalidOperationException : 데이터베이스 공급자가 구성되어 있지 않습니다. DbContext 클래스의 OnConfiguring 또는 서비스 설정시 AddDbContext 메서드를 재정 의하여 데이터베이스 공급자를 구성합니다.

여기 내 구성 방법은 다음과 같습니다.

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();

        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();

        services.AddTransient<ApplicationUnitOfWork>(instance => new ApplicationUnitOfWork());
    }

ApplicationUnitOfWork 는 타이트 커플 링을 줄이기 위해 EF7을 능가합니다. 지금까지 모든 것이 있습니다 :

public class ApplicationUnitOfWork : IUnitOfWork
    {
    readonly ApplicationDbContext dbContext;

    public ApplicationUnitOfWork()
        {
        dbContext = new ApplicationDbContext();
        Products = new ProductRepository(dbContext);
        }

    public void Dispose() { dbContext.Dispose(); }

    public IUserRepository Users { get; }

    public IRepository<SoftwareProduct> Products { get; }

    public async Task CommitAsync() { await dbContext.SaveChangesAsync(); }

    public void Cancel() { throw new NotImplementedException(); }
    }

이제 웹 응용 프로그램을 실행할 때 사용자 계정을 등록하고 로그인 할 수 있으며 EF는 데이터베이스를 만들고 ID 테이블을 만들고 사용자 데이터로 채 웁니다. 제품 테이블도 생성되므로 EF는 ApplicationDbContext 를 사용하여 데이터베이스와 스키마를 만드는 데 사용하는 공급자를 찾을 수 있습니다.

내가 사용하는 내 제품의 컨트롤러에 액세스하려고 할 때 ProductsRepository , EF는 불평 - 비록 ApplicationDbContext 두 경우 모두에서 사용하고 데이터베이스를 만드는 데 사용 된!

그러면 어떻게 될까요? ASP.net Identity에 대한 특별한 점은 어떻게 든 공급자를 얻을 수 있지만 내 코드는 얻을 수 없다는 것입니다. "마술 주문"은 무엇을 놓치고 있습니까?

수락 된 답변

왜냐하면 당신이 그것을 주입하는 대신 그것을 새 것으로 만들기 때문입니다. 새로 만들려는 사람이 구성되지 않았습니다. 클래스를 생성자로 전달하도록 클래스를 변경해야합니다.

DbContext에는 둘 이상의 생성자가 있으며이 구성자를 구성하지 않은 빈 컨테이너를 사용 중입니다.

다음과 같이 생성자를 만들어 주입하는 것이 좋습니다.

 public ApplicationUnitOfWork(ApplicationDbContext context)
 {
    dbContext = context;
    Products = new ProductRepository(dbContext);
 }

코드에서 ApplicationDbContext가 DI에 등록되어 있음을 보여줍니다. ID는 삽입 된 ID를 사용하지만 사용자가 매개 변수없는 생성자로 직접 새로 작성한 이후는 아닙니다.

ApplicationUnitOfWork를 등록 할 수 있도록 등록해야합니다.

services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();


Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow