Asp.net core mvc MVC 6 EF7 RC1创建多个DBContext

Asp.net core mvc MVC 6 EF7 RC1创建多个DBContext,asp.net-core-mvc,entity-framework-core,Asp.net Core Mvc,Entity Framework Core,我试图弄清楚如何在EF7RC1中创建第二个DB上下文。在过去,我可以使用带有:base(“connectionName”)的构造函数,但这似乎不再是一个选项,因为它表示无法将字符串转换为System.IServiceProvider 我的第二个上下文代码如下: public class DecAppContext : DbContext { public DecAppContext() // :base("DefaultConnection")

我试图弄清楚如何在EF7RC1中创建第二个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; }
    }
}
在启动的“配置服务”部分,我添加了两个上下文:

services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<ApplicationDbContext>(options =>
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]))
                .AddDbContext<DecAppContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
我得到一个错误:

未配置任何数据库提供程序。通过以下方式配置数据库提供程序: 在DbContext类或 设置服务时使用AddDbContext方法


在EF7RC1中,任何具有多个db上下文并访问它们的工作示例都将非常感谢

首先,我建议您访问GitHub上EntityFramework的wiki。本文描述了许多定义
DbContext
的方法,其中引用了
appsettings.json
的一节。我个人更喜欢使用
[FromServices]
属性的方式

代码可能与以下内容有关:

首先,您使用以下内容定义了
appsettings.json

{
“数据”:{
“ApplicationDbConnectionString”:“服务器=(localdb)\\mssqllocaldb;数据库=ApplicationDb;受信任的连接=True;MultipleActiveResultSets=True”,
“DecAppDbConnectionString”:“服务器=服务器=(localdb)\\mssqllocaldb;数据库=DecAppDb;受信任的连接=True;MultipleActiveResultSets=True”
}
}
其中定义了两个连接字符串

秒,您可以声明类
DecAppContext
ApplicationDbContext
,它们将
DbContext
作为基类。最简单的形式是

公共类ApplicationDbContext:DbContext
{
}
公共类DecAppContext:DbContext
{
}
没有任何
DbSet
属性

第三步。您可以使用
Microsoft.Extensions.DependencyInjection
注入数据库上下文。要做到这一点,您只需要在
Startup.cs
中包含以下内容

公共类启动
{
//用于保存配置的属性
公共IConfigurationRoot配置{get;set;}
公共启动(IHostingEnvironment环境)
{
//设置配置源。
var builder=new ConfigurationBuilder()
.AddJsonFile(“appsettings.json”)
.AddenEnvironmentVariables();
//在配置属性中保存配置
Configuration=builder.Build();
}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
//添加框架服务。
services.AddMvc()
.AddJsonOptions(选项=>{
options.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();
});
services.AddEntityFramework()
.AddSqlServer()文件
.AddDbContext。下一版本的MVC(RC2)将需要更改上述代码,以使用
[FromServices]
作为附加参数(例如方法
Get()
),而不是使用公共属性
[FromServices]公共应用程序上下文应用程序上下文{Get;set;}
。需要删除属性
ApplicationDbContext
,并向
Get()
方法添加额外参数:
public async IEnumerable Get([FromServices]ApplicationDbContext ApplicationDbContext){…}
。这样的更改很容易完成。请参阅MVC演示示例中的更改和示例:

[路由(“api/[控制器]”)]
公共类UsersController:控制器
{
[HttpGet]
公共异步IEnumerable Get(
[FromServices]应用程序上下文应用程序上下文,
[FromServices]DecAppContext(DecAppContext)
{
var returnObject=新列表();
//…与以前相同的代码,但使用applicationDbContext
//和decAppContext参数,而不是ApplicationDbContext
//和DecAppContext属性
}

如果我使用的是同一个数据库,我是否需要使用两个不同的连接字符串,或者我是否可以使用与我当前在config.jsonAlso中使用的相同的连接字符串,如果你没有在dbcontext中指定任何dbset,它如何知道与该上下文相关联的表?@Xaxum:当然可以使用相同的数据库或不同的数据库n选择。使用两个不同上下文的主要目的是:对应表的位置可以不同。您可以只定义一个上下文实体之间的引用关系。因此,在我看来,使用两个连接字符串提供了更好的选择。在不同的数据库中移动表不需要更改代码。I重复:这是您的选择,您可以使用一个或两个连接字符串。@Xaxum:我想强调的是,
public DbSet VignetteModels{get;set;}
或其他一些
DbSet
不是必需的,但您可以使用它。我个人使用存储过程或动态选择来生成从Web Api方法返回的数据。ASP.NET 5没有和SqlCommand,但实体框架7支持原始SQL查询(通过DbSet.FromSql)和
.CreateCommand()
允许使用纯SQL语句或存储过程。我在代码中演示了如何使用它。
/api/users
返回在
中定义的属性“SELECT Id,FirstName FROM dbo.users”
@Xaxum:您可以修改上面的示例
userscocontroller
以使用存储过程而不是内联SQL语句,或者从应用程序配置
appsettings.json
获取SQL语句。这样,在扩展数据库时就不需要修改代码了。这只是我的代码描述,但您可以按照下面的方式操作你的策略。我开始回答时提到了许多不同的问题
services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<ApplicationDbContext>(options =>
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]))
                .AddDbContext<DecAppContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
private DecAppContext db = new DecAppContext();
var vignette = db.VignetteModels.SingleOrDefault(v => v.CaseId == vid);