2017-04-06 7 views
0

이 질문은 여러 번 묻지 만 아직 해결 방법을 찾지 못했습니다.DotNet 코어,이 DbContext에 대해 데이터베이스 공급자가 구성되어 있지 않습니다.

저는 DotNet Core에서 매우 새로 왔습니다. 내 문제는 간단한 "linq"명령을 사용하여 "Header"테이블에서 데이터를 선택하려고하지만 아래 오류가 발생했습니다.

추가 정보 : 이 DbContext에 대해 데이터베이스 공급자가 구성되어 있지 않습니다. 공급자는 DbContext.OnConfiguring 메서드를 재정의하거나 응용 프로그램 서비스 공급자에서 AddDbContext를 사용하여 구성 할 수 있습니다. AddDbContext가 사용되는 경우 DbContext 형식이 해당 생성자 의 DbContextOptions 개체를 수락하고 DbContext의 기본 생성자에 전달하는지 확인합니다.

내 컨트롤러입니다.

public HeaderModel GetHeaderInformation() 
    { 
     using(var context = new ApplicationDbContext()) 
     { 
      var header = context.Headers.Select(x => new HeaderModel 
      { 
       colorCode = x.colorCode, 
       height = x.height, 
       Id = x.Id, 
       left = x.left, 
       top = x.top, 
       width = x.width 
      }).FirstOrDefault(); 

      return header; 
     } 
    } 

내 ApplicationDbContext는 다음과 같습니다.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> //DbContext 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
     : base(options) 
    { 
    } 

    public ApplicationDbContext() : base() 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 

    public DbSet<Header> Headers { get; set; } 
    public DbSet<Menu> Menus { get; set; } 
} 

그리고 내 startup.cs입니다.

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 
     services.AddApplicationInsightsTelemetry(Configuration); 
     services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders(); 
     services.AddMvc(); 

도움 주셔서 감사합니다.

답변

6

당신은 의존성 주입을 사용하고 있습니다. services.AddDbContext은 DbContext 개체를 생성하는 역할을 담당합니다. 연결 문자열이없는 새 ApplicationDbContext를 인스턴스화하기 때문에 블록을 사용하는 데 아무런 요점이 없습니다.

public HeaderModel GetHeaderInformation(ApplicationDbContext context) 
{ 
    // the code inside your using block 
} 

및 닷넷 의존성 주입을 통해 상황을 해결할 수 :


은 다음과 같이 당신의 방법을 작성합니다.



또한, 일반적인 관행은 생성자 클래스의 사설 읽기 전용 atribute로 DbContext하는 것입니다. 따라서 다음과 같은 작업을 수행 할 수 있습니다.

public class MyConroller : Controller 
{ 
    private readonly MyDbContext _context; 

    public MyConroller(MyDbContext ctx) 
    { 
     _context = ctx; 
    } 
} 

및 해당 방법에서 컨텍스트 속성을 사용하십시오.

+0

답장을 보내 주셔서 감사합니다. 사용중인 블록에서 내 dbContext를 새로 고치고 해당 DbSet <>을 사용하여 데이터를 선택, 추가 및 삭제하려고합니다. 귀하의 솔루션은 괜찮지 만 내 문제를 해결하지 못했습니다. –

+0

컨트롤러가 아닌 클래스의 컨스트럭터에 dbcontext를 어떻게 주입시킬 수 있습니까? – zuckerthoben

+0

@zuckerthoben 당신은 [이 질문에 대한 답변을 가지고 (https://stackoverflow.com/questions/37189984/dependency-injection-with-classes-other-than-a-controller-class) :) – 5ar

0

매개 변수없는 생성자는 DI가 새 인스턴스를 만들 때 호출되는 것이므로 제거해야합니다. 나는 이것이 어떤 사람들에게는 문제라는 것을 알고 있으며, 그것이 도움이되기를 바랍니다.