ASP.NET 5、Entity Framework 7およびSQL Server 2014 - 複数のdbContext、SQLビュー

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

質問

Visual Studio 2015で、Webプロジェクト(ASP.NET 5 Beta 6 Webアプリケーションプレビューテンプレートを使用)とモデルプロジェクト(Entity Framework 7 Beta 6を使用)からなるソリューションを作成しました。

SQL Serverデータベースからデータを取得してページに表示できるようになりました。次に、2つの異なるデータベースからデータを取得しようとしましたが、複数のdbContextを使用しようとすると問題が発生しました。

Startup.csでは、EFサービスを追加し、うまく動作するdbContextを追加します。しかし、私は複数を追加する方法がわかりません...以下のコードは別のものを追加しようとしたものですが、2番目のAddDbContextは最初のものを上書きするようです。

私はまたこれに関連する別の問題に遭遇しました。SQLビューからデータを取得できませんでした。ビューにデータが含まれていることを確認しましたが、そのビューからデータを取得するWebAPIメソッドを記述すると、レスポンスには何も含まれません。 EF6を使った過去のプロジェクトでは、ビューのモデリングやデータの取得に問題はありませんでした。

私の質問を要約すると:

  1. EF7を使用してASP.NET 5 Webプロジェクトで複数のdbContextを設定するにはどうすればよいですか?
  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;
    }
}

上記の例では、1つのdbContextで作業し、Productなどの通常のテーブルを使用するためのすべてを取得できます。しかし、私がビューを使用しようとすると、データは得られません。複数のコンテキストを使用すると、2番目のコンテキストが最初のコンテキストを上書きします。

受け入れられた回答

これが誰にも役立つ場合、これは.NET CoreとEF Core 1.0.0ではもう問題になりません。以下は、Web 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のコンストラクタをDbContextのように変更してみてください:

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

ToList()呼び出すと、

return data.ToList();

これらはそれぞれ、 EFおよびMVCリポジトリに登録したいバグです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ