【问题标题】:Entity Framework Core Using multiple DbContexts使用多个 DbContext 的实体框架核心
【发布时间】:2017-10-01 18:01:06
【问题描述】:

我遇到了一个问题,当我尝试访问 PartsDbContext 中的字段时,出现以下错误:

System.Data.SqlClient.SqlException: '无效的对象名'fieldName''

这似乎是因为我试图让我的 PartsDbContext 使用与 Identity 一起使用的 ApplicationDbContext 相同的数据库。我需要知道如何设置第二个 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 以与 Entity Framework Core 一起使用,EF-Core 将自动创建数据库。

【问题讨论】:

  • 你能用"PartsConnection": "Server=(localdb)\\mssqllocaldb;Database=PartsDb;Trusted_Connection=True" 替换"PartsConnection": "Server=(localdb)\\mssqllocaldb;Database=PartsDb" 吗?

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


【解决方案1】:

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

我的情况是我正在尝试使用 EF-Identity 和 Area 创建一个管理面板,在我的管理区域拥有自己的控制器/模型/视图...,还包含一个新的 DBcontext。

有问题,如果你尝试context.Database.EnsureCreated();初始化DB会有问题

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

【讨论】:

    【解决方案2】:

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

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

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

    然而,本教程提出了一种更简洁的方法。

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

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

    1. 在 PMC 中运行给定的命令,您就可以设置好了。
      • Add-Migration init -Context ModelContext
      • 更新数据库-上下文 ModelContext

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

    【讨论】:

      【解决方案3】:

      我想通了。这主要是因为我不小心删除了 Identity 正在使用的数据库,我需要弄清楚如何取回它。

      显然我的连接字符串没有任何问题。我只需要进入包管理器并按以下顺序输入这些命令:

      1. Add-Migration init -Context PartsDbContext
      2. Update-Database -Context PartsDbContext

      我发现这一点是因为我必须这样做才能让我的 ApplicationDbContext 再次工作,事实证明,当您使用个人用户身份验证在 Visual Studio 中创建新的 MVC Core Web 应用程序时,此步骤已为您完成。

      所以基本上添加更多 DbContexts 的步骤是:

      1. 创建 DbContext 类
      2. 在 appsettings.json 中为该 DbContext 创建一个连接字符串
      3. 将 DbContext 添加到您在 Startup.cs 中配置的服务中
      4. 在将使用它的控制器中设置 DbContext。
      5. 打开包管理器并运行上面的 2 行。 (如果“-Context”不起作用,请尝试“--context”
      6. 运行您的程序,让 EntityFrameworkCore 处理其余的工作。

      【讨论】:

      • 你是在使用多个数据库的同一个数据库吗?如果是前者,您如何为 EFMigrationsHistory 表中的每个上下文分离迁移?
      • 我正在使用多个数据库
      • 如果您在启动时有一个环境条件来确定用于给定上下文的 appsettings.json 连接字符串怎么办?你怎么知道要使用哪一个 pm 控制台?
      • 您是否在 git 项目或类似的项目中更好地解释了所有这些步骤?
      • 你知道是否有办法设置默认的 DbContext 吗?这样就不用每次都输入-context了?
      猜你喜欢
      • 2020-10-15
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2020-05-16
      • 2021-01-22
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多