다중 dbcontexts를 만드는 MVC 6 EF7 RC1

asp.net-core-mvc entity-framework-core

문제

EF7 RC1에서 두 번째 DB 컨텍스트를 만드는 방법을 파악하려고합니다. 과거에는 다음과 함께 생성자를 사용할 수있었습니다. base ( "connectionName")하지만 더 이상 옵션으로 보이지 않습니다. 문자열을 System.IServiceProvider로 변환 할 수 없다고 말합니다.

내 두 번째 컨텍스트 코드는 다음과 같습니다.

public class DecAppContext : DbContext
    {

        public DecAppContext()
          //  :base("DefaultConnection")
        {

        }
        public DbSet<VignetteModels> VignetteModels { get; set; }
        public DbSet<VignetteResult> Result { get; set; }
    }
}

내 config.json에서 연결이 지정되었습니다.

public class DecAppContext : DbContext
    {

        public DecAppContext()
          //  :base("DefaultConnection")
        {

        }
        public DbSet<VignetteModels> VignetteModels { get; set; }
        public DbSet<VignetteResult> Result { get; set; }
    }
}

시작시 구성 서비스 섹션에서 두 컨텍스트를 모두 추가했습니다.

public class DecAppContext : DbContext
    {

        public DecAppContext()
          //  :base("DefaultConnection")
        {

        }
        public DbSet<VignetteModels> VignetteModels { get; set; }
        public DbSet<VignetteResult> Result { get; set; }
    }
}

문제없이 사용자를 생성하고 로그인 할 수 있으므로 applicationDB 컨텍스트가 올바르게 작동합니다.

그러나 내 컨트롤러에서와 같이 다른 컨텍스트에 액세스하려고 할 때 :

public class DecAppContext : DbContext
    {

        public DecAppContext()
          //  :base("DefaultConnection")
        {

        }
        public DbSet<VignetteModels> VignetteModels { get; set; }
        public DbSet<VignetteResult> Result { get; set; }
    }
}

오류가 발생했습니다.

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

여러 DB 컨텍스트와 액세스하는 EF7 RC1의 모든 작동 예제는 많은 도움이 될 것입니다.

수락 된 답변

먼저 GitHub의 EntityFramework 위키 에서 기사 를 추천합니다. 이 기사에서는 appsettings.json 의 섹션을 참조하는 DbContext 를 정의하는 여러 가지 방법에 대해 설명합니다. 저는 개인적으로 [FromServices] 속성의 사용법을 선호합니다.

코드는 다음과 같습니다.

먼저 다음과 같은 내용으로 appsettings.json 을 정의했습니다.

{
  "Data": {
    "ApplicationDbConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;MultipleActiveResultSets=true",
    "DecAppDbConnectionString": "Server=Server=(localdb)\\mssqllocaldb;Database=DecAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

여기서 두 개의 연결 문자열을 정의합니다.

초 당신은 클래스 선언 DecAppContextApplicationDbContextDbContext 기본 클래스로합니다. 가장 간단한 형태는 단지

{
  "Data": {
    "ApplicationDbConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;MultipleActiveResultSets=true",
    "DecAppDbConnectionString": "Server=Server=(localdb)\\mssqllocaldb;Database=DecAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

DbSet 속성없이.

세 번째 단계. Microsoft.Extensions.DependencyInjection 을 사용하여 데이터베이스 컨텍스트를 주입합니다. 이렇게하려면 Startup.cs 다음과 같이 입력하면됩니다.

{
  "Data": {
    "ApplicationDbConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;MultipleActiveResultSets=true",
    "DecAppDbConnectionString": "Server=Server=(localdb)\\mssqllocaldb;Database=DecAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Se는 "Data:DecAppDbConnectionString""Data:ApplicationDbConnectionString" 구성을 사용하여 두 개의 DbContext ( DecAppContextApplicationDbContext )를 "Data:DecAppDbConnectionString" .

이제 컨트롤러에서 컨텍스트를 사용할 수 있습니다. 예를 들어

{
  "Data": {
    "ApplicationDbConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;MultipleActiveResultSets=true",
    "DecAppDbConnectionString": "Server=Server=(localdb)\\mssqllocaldb;Database=DecAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

또는 async / await를 사용하여 같음 :

{
  "Data": {
    "ApplicationDbConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;MultipleActiveResultSets=true",
    "DecAppDbConnectionString": "Server=Server=(localdb)\\mssqllocaldb;Database=DecAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

하나는 속성을 선언 할 수 있습니다. public ApplicationDbContext ApplicationDbContext { get; set; } 속성을 [FromServices] 하고 ASP.NET은 ConfigureServices 삽입 된 컨텍스트 [FromServices] 속성을 초기화합니다. 같은 방식으로 필요할 때마다 두 번째 컨텍스트 인 DecAppContext 사용할 수 있습니다.

위 코드 예제는 데이터베이스 컨텍스트에서 SELECT Id, FirstName From dbo.Users 를 실행하고 JSON 데이터를 [{"id":123, "firstName":"Oleg"},{"id":456, "firstName":"Xaxum"}] . IdFirstName 에서 idfirstName 의 속성 이름 변환은 ConfigureServices 의 사용법 AddJsonOptions 때문에 직렬화 중에 자동으로 수행됩니다.

업데이트 : 발표 를 참조해야합니다. MVC (RC2)의 다음 버전에서는 [FromServices][FromServices] 사용하도록 위의 코드를 변경해야합니다 Get()Get() 메서드 Get() [FromServices] public ApplicationDbContext ApplicationDbContext { get; set; } public property [FromServices] public ApplicationDbContext ApplicationDbContext { get; set; } . 하나는 속성 ApplicationDbContext 를 제거하고 추가 매개 변수를 Get() 메서드에 추가해야합니다. public async IEnumerable<object> Get([FromServices] ApplicationDbContext applicationDbContext) {...} . 이러한 변경은 쉽게 수행 할 수 있습니다. MVC의 데모 예제에서 변경된 사항의 ​​예와 예를 참조 하십시오 .

{
  "Data": {
    "ApplicationDbConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;MultipleActiveResultSets=true",
    "DecAppDbConnectionString": "Server=Server=(localdb)\\mssqllocaldb;Database=DecAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.