实体框架核心使用多个DbContexts

时间:2017-05-03 18:53:59

标签: c# entity-framework-core dbcontext asp.net-core-1.1

我遇到问题,当我尝试访问我的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。

3 个答案:

答案 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:

  1. Add-Migration init -Context PartsDbContext
  2. 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. Create a DbContext Class
  2. Create a Connection string for that DbContext in appsettings.json
  3. Add the DbContext to your configured services in Startup.cs
  4. Setup the DbContext in the controllers that will use it.
  5. Open the package manager and run the 2 lines above. (if "-Context" doesn't work try "--context"
  6. Run your program and let EntityFrameworkCore take care of the rest.

答案 1 :(得分:0)

我还不能发表评论,但我想补充答案。

目前我正在学习本教程:https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/model?view=aspnetcore-5.0&tabs=visual-studio

但我也是从 ApplicationDbContext for Identity 开始的。所以,我遇到了类似的问题。您的回答帮助了我,谢谢!

然而,本教程提出了一种更简洁的方法来做到这一点。

  1. 添加数据模型
  2. 搭建数据模型!

这一步是巨大的。它创建了 Context 类、appsettings.json 中的一个连接字符串,在 Startup.cs 中添加了 Context 等等。 有关脚手架的使用,请查看链接教程。

  1. 在 PMC 中运行给定的命令即可。
    • 添加迁移初始化 -Context ModelContext
    • Update-Database -Context ModelContext

所以,我建议使用脚手架,因为它最适合您。

答案 2 :(得分:0)

首先感谢@Joe Higley 回答这个问题,我想添加更多的情况来帮助更多的人。

我的情况是我正在尝试使用 EF-IdentityArea 创建一个管理面板,在我的管理区域中拥有自己的控制器/模型/视图...,还包含一个新的 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