我遇到问题,当我尝试访问我的PartsDbContext中的字段时,出现以下错误:
System.Data.SqlClient.SqlException:'无效的对象名称' fieldName''
这似乎是因为我试图使我的PartsDbContext使用与我的ApplicationDbContext相同的数据库,该数据库与Identity一起使用。我需要知道如何设置第二个dbcontext以使用/使用/创建不同数据库的EF核心。
我已尝试创建第二个连接字符串,但这会让我犯这个错误:
System.Data.SqlClient.SqlException:'无法打开数据库" PartsDb"登录请求。登录失败。 用户登录失败' 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。
答案 0 :(得分:19)
I figured it out. This mostly came about because I accidentally deleted the database that Identity was using and I needed to figure out how to get it back.
Apparently there's nothing wrong with my connection string the way it is. I just needed to go into the package manager and type these commands in this order:
Add-Migration init -Context PartsDbContext
Update-Database -Context PartsDbContext
I found this out because that is what I had to do to get my ApplicationDbContext working again and it turns out that this step is done for you when you create a new MVC Core Web Application in Visual Studio using Individual User Authentication.
So basically the steps for adding more DbContexts is to:
答案 1 :(得分:0)
我还不能发表评论,但我想补充答案。
但我也是从 ApplicationDbContext for Identity 开始的。所以,我遇到了类似的问题。您的回答帮助了我,谢谢!
然而,本教程提出了一种更简洁的方法来做到这一点。
这一步是巨大的。它创建了 Context 类、appsettings.json 中的一个连接字符串,在 Startup.cs 中添加了 Context 等等。 有关脚手架的使用,请查看链接教程。
所以,我建议使用脚手架,因为它最适合您。
答案 2 :(得分:0)
首先感谢@Joe Higley 回答这个问题,我想添加更多的情况来帮助更多的人。
我的情况是我正在尝试使用 EF-Identity 和 Area 创建一个管理面板,在我的管理区域中拥有自己的控制器/模型/视图...,还包含一个新的 DBcontext .
有问题,如果你尝试context.Database.EnsureCreated();
来初始化数据库会显示
System.Data.SqlClient.SqlException: '无效的对象名称 'fieldName''
参考此链接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