ASP.NET 5, Entity Framework 7 및 SQL Server 2014 - 여러 개의 dbContexts, SQL 뷰

asp.net-core dbcontext entity-framework-core sql-server-2014 visual-studio-2015

문제

Visual Studio 2015에서 웹 프로젝트 (ASP.NET 5 Beta 6 웹 응용 프로그램 미리보기 템플릿 사용)와 모델 프로젝트 (Entity Framework 7 Beta 6 사용)로 구성된 솔루션을 만들었습니다.

SQL Server 데이터베이스에서 데이터를 가져 와서 페이지에 표시 할 수있는 지점에 도달했습니다. 그런 다음 두 개의 다른 데이터베이스에서 데이터를 가져 오려고했지만 여러 dbContext를 사용하려고 할 때 문제가 발생했습니다.

Startup.cs에서 EF 서비스를 추가하고 잘 작동하는 dbContext를 추가합니다. 하지만 하나 이상의 코드를 추가하는 방법을 모르겠습니다 ... 아래 코드는 다른 코드를 추가하는 방법이지만 두 번째 AddDbContext는 첫 번째 코드를 덮어 쓰는 것 같습니다.

나는 또한 이것과 관련된 또 다른 문제를 겪었다. SQL 뷰에서 데이터를 가져올 수 없었다. 뷰에 데이터가 포함되어 있는지 확인했지만 해당 뷰에서 데이터를 가져 오기 위해 WebAPI 메서드를 작성할 때 응답에 아무것도 포함되어 있지 않습니다. EF6을 사용하는 과거 프로젝트에서 필자는 뷰를 모델링하고 뷰를 모델링하는 데 문제가 없었습니다.

내 질문을 요약하려면 다음과 같이하십시오.

  1. EF7을 사용하여 ASP.NET 5 웹 프로젝트에서 여러 dbContexts를 어떻게 설정합니까?
  2. EF7에서 SQL Server보기를 어떻게 모델링합니까?

Startup.cs :

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    // Setup configuration sources.
    var builder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

// This method gets called by a runtime.
// Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
    // Register Entity Framework
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<MyContextA>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:AConnectionString"])
        )
        .AddDbContext<MyContextB>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:BConnectionString"])
        );

    services.AddMvc();
}

config.json

{
  "Data": {
    "DefaultConnection": {
      "AConnectionString": "data source=xxxxxxx;initial catalog=xxxxxxxx;Uid=xxxxxxxxx;Pwd=xxxxxx;",
      "BConnectionString": "data source=xxxxxxx;initial catalog=xxxxxxxx;Uid=xxxxxxxxx;Pwd=xxxxxx;"
    }
  },
  "EntityFramework": {
    "MyContextA": {
      "ConnectionStringKey": "Data:DefaultConnection:AConnectionString"
    },
    "MyContextB": {
      "ConnectionStringKey": "Data:DefaultConnection:BConnectionString"
    }
  }
}

MyContextA.cs

public class MyContextA : DbContext
{
    public MyContextA (DbContextOptions options) : base(options) { }
    public DbSet<Product> Product { get; set; }
    public DbSet<Some_View> Some_View { get; set; }
}

MyContextB.cs

public class MyContextB : DbContext
{
    public MyContextB (DbContextOptions options) : base(options) { }
    public DbSet<Customer> Customer { get; set; }
}

Product.cs

public class Product
{
    [Key]
    public int ID { get; set; }
    public int Name { get; set; }
}

Some_View.cs

public class Some_View
{
    public int SomeField { get; set; }
    public int AnotherField { get; set; }
}

TestController.cs

[Route("api/[controller]")]
public class TestController : Controller
{
    private readonly MyContextA _dbContext;

    // Constructor
    public TestController(MyContextA dbContext)
    {
        _dbContext = dbContext;
    }

    // GET: api/values
    [HttpGet]
    public IEnumerable<Some_View> Get()
    {
        var data = _dbContext.Some_View;
        return data;
    }
}

위의 예에서 하나의 dbContext로 작업하고 Product와 같은 일반 테이블을 사용하여 모든 것을 얻을 수 있습니다. 그러나 뷰를 사용하려고 할 때 데이터가 없으며 여러 컨텍스트를 사용하면 두 번째 컨텍스트가 첫 번째 컨텍스트를 재정의합니다.

수락 된 답변

이 방법으로 누구에게 도움이 될지 모르지만 .NET Core 및 EF Core 1.0.0에서는 더 이상 문제가되지 않습니다. 다음은 웹 API Startup.cs에서 각 dbcontext를 등록하는 방법입니다.

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddDbContext<Context1>(options => options.UseSqlServer(Configuration["ConnectionStrings:Connection1"]));
    services.AddDbContext<Context2>(options => options.UseSqlServer(Configuration["ConnectionStrings:Connection2"]));
    // ...
}

appsettings.DEVELOPMENT.json

{
  "ConnectionStrings": {
    "Connection1": "[connection string here]",
    "Connection2": "[connection string here]",
  }
}

인기 답변

다음과 같이 DbContext 의 생성자를 변경해보십시오.

public MyContextA (DbContextOptions<MyContextA> options) : base(options) { }
public MyContextB (DbContextOptions<MyContextB> options) : base(options) { }

ToList() 호출 해보십시오.

return data.ToList();

이들 각각은 EFMVC repos에 파일로 저장하려는 버그 일 수 있습니다.



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