ASP.NET 5,Entity Framework 7 & SQL Server 2014 - 多个 dbContexts,SQL 视图
ASP.NET 5, Entity Framework 7 & SQL Server 2014 - multiple dbContexts, SQL views
我在 Visual Studio 2015 年创建了一个解决方案,包括一个 Web 项目(使用 ASP.NET 5 Beta 6 Web 应用程序预览模板)和一个模型项目(使用 Entity Framework 7 测试版 6).
我已经到了可以从 SQL 服务器数据库获取数据并将其显示在页面上的地步。然后,我想尝试从两个不同的数据库中提取数据,但是 运行 在尝试使用多个 dbContext 时遇到问题。
在 Startup.cs 中,我添加了 EF 服务并添加了一个 dbContext,效果很好。但我不确定如何添加多个...下面的代码是我尝试添加另一个的方式,但第二个 AddDbContext 似乎只是覆盖了第一个。
我也 运行 进入另一个与此有点相关的问题。我无法从 SQL 视图中获取数据。我已经确认该视图确实包含数据,但是当我编写一个 WebAPI 方法从该视图获取数据时,响应不包含任何内容。在过去使用 EF6 的项目中,我在建模视图和从中检索数据时没有遇到任何问题。
总结一下我的问题:
- 如何使用 EF7 在 ASP.NET 5 web 项目中设置多个 dbContext?
- 如何在 EF7 中为 SQL 服务器视图建模?
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)来使一切正常工作。但是当我尝试使用视图时,我没有得到任何数据,当我使用多个上下文时,第二个上下文会覆盖第一个。
尝试将 DbContext
的构造函数更改为如下所示:
public MyContextA (DbContextOptions<MyContextA> options) : base(options) { }
public MyContextB (DbContextOptions<MyContextB> options) : base(options) { }
尝试调用 ToList()
return data.ToList();
万一这对任何人有帮助,对于 .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]",
}
}
我在 Visual Studio 2015 年创建了一个解决方案,包括一个 Web 项目(使用 ASP.NET 5 Beta 6 Web 应用程序预览模板)和一个模型项目(使用 Entity Framework 7 测试版 6).
我已经到了可以从 SQL 服务器数据库获取数据并将其显示在页面上的地步。然后,我想尝试从两个不同的数据库中提取数据,但是 运行 在尝试使用多个 dbContext 时遇到问题。
在 Startup.cs 中,我添加了 EF 服务并添加了一个 dbContext,效果很好。但我不确定如何添加多个...下面的代码是我尝试添加另一个的方式,但第二个 AddDbContext 似乎只是覆盖了第一个。
我也 运行 进入另一个与此有点相关的问题。我无法从 SQL 视图中获取数据。我已经确认该视图确实包含数据,但是当我编写一个 WebAPI 方法从该视图获取数据时,响应不包含任何内容。在过去使用 EF6 的项目中,我在建模视图和从中检索数据时没有遇到任何问题。
总结一下我的问题:
- 如何使用 EF7 在 ASP.NET 5 web 项目中设置多个 dbContext?
- 如何在 EF7 中为 SQL 服务器视图建模?
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)来使一切正常工作。但是当我尝试使用视图时,我没有得到任何数据,当我使用多个上下文时,第二个上下文会覆盖第一个。
尝试将 DbContext
的构造函数更改为如下所示:
public MyContextA (DbContextOptions<MyContextA> options) : base(options) { }
public MyContextB (DbContextOptions<MyContextB> options) : base(options) { }
尝试调用 ToList()
return data.ToList();
万一这对任何人有帮助,对于 .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]",
}
}