Entity Framework 核心使用多个 DbContext
Entity Framework Core Using multiple DbContexts
我遇到一个问题,当我尝试访问我的 PartsDbContext 中的一个字段时,出现以下错误:
System.Data.SqlClient.SqlException: 'Invalid object name 'fieldName''
这似乎是因为我试图让我的 PartsDbContext 使用与我的 ApplicationDbContext 相同的数据库,后者与 Identity 一起使用。我需要知道如何设置第二个 dbcontext 以使用 uses/creates 不同数据库的 EF 核心。
我试过创建第二个连接字符串,但出现了这个错误:
System.Data.SqlClient.SqlException: 'Cannot open database "PartsDb" requested by the login. The login failed.
Login failed for user 'DESKTOP-4VPU567\higle'.'
这是我的代码:
appsettings.json
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=aspnet-PrecisionCustomPC-b14db89e-86ad-4855-a17f-ac64a04339aa;Trusted_Connection=True;MultipleActiveResultSets=true",
"PartsConnection": "Server=(localdb)\mssqllocaldb;Database=PartsDb"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
PartsDbContext.cs
public class PartsDbContext : DbContext
{
public DbSet<PartsViewModels.Tower> Towers { get; set; }
public DbSet<PartsViewModels.Motherboard> Motherboards { get; set; }
public PartsDbContext(DbContextOptions<PartsDbContext> options)
: base(options)
{
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddEntityFramework()
.AddDbContext<PartsDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("PartsConnection")));
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
});
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
AdminController.cs
[Authorize(Policy = "RequireAdminRole")]
public class AdminController : Controller
{
private readonly PartsDbContext _context;
public AdminController(PartsDbContext context)
{
_context = context;
}
public IActionResult Index()
{
return View();
}
public IActionResult Towers()
{
var model = _context.Towers.ToList();
return View(model);
}
}
第 var model = _context.Towers.ToList();
行是出现错误的地方。
再来一次。我想设置我的 PartsDbContext 以 EF-Core 自动创建数据库的方式与 Entity Framework Core 一起工作。
我明白了。这主要是因为我不小心删除了 Identity 使用的数据库,我需要弄清楚如何找回它。
显然我的连接字符串没有任何问题。我只需要进入包管理器并按以下顺序键入这些命令:
Add-Migration init -Context PartsDbContext
Update-Database -Context PartsDbContext
我发现了这一点,因为这是让我的 ApplicationDbContext 再次工作所必须做的事情,事实证明,当您在 Visual Studio 中使用个人用户认证。
所以基本上添加更多 DbContext 的步骤是:
- 创建 DbContext Class
- 在 appsettings.json
中为该 DbContext 创建连接字符串
- 将 DbContext 添加到您在 Startup.cs
中配置的服务
- 在将使用它的控制器中设置 DbContext。
- 打开包管理器并运行上面的两行。 (如果“-Context”不起作用尝试“--context”
- 运行 您的程序,让 EntityFrameworkCore 处理剩下的事情。
我还不能发表评论,但我想补充一下答案。
但我也是从 ApplicationDbContext for Identity 开始的。于是,我运行陷入了类似的问题。你的回答帮了我大忙,谢谢!
然而,本教程提出了一种更简洁的方法。
- 添加数据模型
- 搭建数据模型!
这一步很大。它创建上下文 class,appsettings.json 中的连接字符串,在 Startup.cs 中添加上下文并更多的。
有关脚手架的用法,请查看链接教程。
- 运行 在 PMC 中给定命令,您已设置好。
- Add-Migration init -Context ModelContext
- 更新数据库-Context ModelContext
因此,我建议使用脚手架,因为它最适合您。
首先感谢@Joe Higley 回答这个问题,我想补充更多的情况来帮助更多的人。
我的情况是我正在尝试使用 EF-Identity and Area 创建一个管理面板,在我的管理区域中拥有自己的 controller/models/views...,还包含一个新的 DBcontext。
有问题,如果你尝试context.Database.EnsureCreated();
初始化数据库会显示
System.Data.SqlClient.SqlException: 'Invalid object name 'fieldName''
参考此 link Migrations with Multiple Providers
我们可以使用迁移并使用 --context 来设置你想要的 DbContext 运行
在VScode中你可以运行
dotnet ef migrations add InitialCreate --context BlogContext
dotnet ef database update
在包管理控制台中,您可以运行
Add-Migration InitialCreate -Context BlogContext
Update-Database
除了之前的注释,你还可以这样使用:
dotnet ef migrations add InitialCreate --context MyContext
dotnet ef database update --context MyContext
或
Add-Migration InitialCreate -Context MyContext
Update-Database -Context MyContext
我遇到一个问题,当我尝试访问我的 PartsDbContext 中的一个字段时,出现以下错误:
System.Data.SqlClient.SqlException: 'Invalid object name 'fieldName''
这似乎是因为我试图让我的 PartsDbContext 使用与我的 ApplicationDbContext 相同的数据库,后者与 Identity 一起使用。我需要知道如何设置第二个 dbcontext 以使用 uses/creates 不同数据库的 EF 核心。
我试过创建第二个连接字符串,但出现了这个错误:
System.Data.SqlClient.SqlException: 'Cannot open database "PartsDb" requested by the login. The login failed. Login failed for user 'DESKTOP-4VPU567\higle'.'
这是我的代码:
appsettings.json
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=aspnet-PrecisionCustomPC-b14db89e-86ad-4855-a17f-ac64a04339aa;Trusted_Connection=True;MultipleActiveResultSets=true",
"PartsConnection": "Server=(localdb)\mssqllocaldb;Database=PartsDb"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
PartsDbContext.cs
public class PartsDbContext : DbContext
{
public DbSet<PartsViewModels.Tower> Towers { get; set; }
public DbSet<PartsViewModels.Motherboard> Motherboards { get; set; }
public PartsDbContext(DbContextOptions<PartsDbContext> options)
: base(options)
{
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddEntityFramework()
.AddDbContext<PartsDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("PartsConnection")));
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
});
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
AdminController.cs
[Authorize(Policy = "RequireAdminRole")]
public class AdminController : Controller
{
private readonly PartsDbContext _context;
public AdminController(PartsDbContext context)
{
_context = context;
}
public IActionResult Index()
{
return View();
}
public IActionResult Towers()
{
var model = _context.Towers.ToList();
return View(model);
}
}
第 var model = _context.Towers.ToList();
行是出现错误的地方。
再来一次。我想设置我的 PartsDbContext 以 EF-Core 自动创建数据库的方式与 Entity Framework Core 一起工作。
我明白了。这主要是因为我不小心删除了 Identity 使用的数据库,我需要弄清楚如何找回它。
显然我的连接字符串没有任何问题。我只需要进入包管理器并按以下顺序键入这些命令:
Add-Migration init -Context PartsDbContext
Update-Database -Context PartsDbContext
我发现了这一点,因为这是让我的 ApplicationDbContext 再次工作所必须做的事情,事实证明,当您在 Visual Studio 中使用个人用户认证。
所以基本上添加更多 DbContext 的步骤是:
- 创建 DbContext Class
- 在 appsettings.json 中为该 DbContext 创建连接字符串
- 将 DbContext 添加到您在 Startup.cs 中配置的服务
- 在将使用它的控制器中设置 DbContext。
- 打开包管理器并运行上面的两行。 (如果“-Context”不起作用尝试“--context”
- 运行 您的程序,让 EntityFrameworkCore 处理剩下的事情。
我还不能发表评论,但我想补充一下答案。
但我也是从 ApplicationDbContext for Identity 开始的。于是,我运行陷入了类似的问题。你的回答帮了我大忙,谢谢!
然而,本教程提出了一种更简洁的方法。
- 添加数据模型
- 搭建数据模型!
这一步很大。它创建上下文 class,appsettings.json 中的连接字符串,在 Startup.cs 中添加上下文并更多的。 有关脚手架的用法,请查看链接教程。
- 运行 在 PMC 中给定命令,您已设置好。
- Add-Migration init -Context ModelContext
- 更新数据库-Context ModelContext
因此,我建议使用脚手架,因为它最适合您。
首先感谢@Joe Higley 回答这个问题,我想补充更多的情况来帮助更多的人。
我的情况是我正在尝试使用 EF-Identity and Area 创建一个管理面板,在我的管理区域中拥有自己的 controller/models/views...,还包含一个新的 DBcontext。
有问题,如果你尝试context.Database.EnsureCreated();
初始化数据库会显示
System.Data.SqlClient.SqlException: 'Invalid object name 'fieldName''
参考此 link Migrations with Multiple Providers
我们可以使用迁移并使用 --context 来设置你想要的 DbContext 运行
在VScode中你可以运行
dotnet ef migrations add InitialCreate --context BlogContext
dotnet ef database update
在包管理控制台中,您可以运行
Add-Migration InitialCreate -Context BlogContext
Update-Database
除了之前的注释,你还可以这样使用:
dotnet ef migrations add InitialCreate --context MyContext
dotnet ef database update --context MyContext
或
Add-Migration InitialCreate -Context MyContext
Update-Database -Context MyContext