实体框架:两个数据库模式,其中一个没有数据库上下文



我一直在尝试在应用程序中连接两个模式。

我将向您解释:我有一个使用自己表的应用程序,所以我通过迁移、模型和DbContext创建了这些表,然后我将这些表托管在SQL Server数据库中,该数据库具有来自其他应用程序的其他架构,一切都很好。单个应用程序连接并接收数据。

但我的应用程序需要连接到SQL Server数据库中的其他模式之一,另一个模式具有相同的连接字符串,因为它们位于同一服务器中。

我还在startup.cs / ConfigureServices中编写了2db上下文

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(_config.GetConnectionString("TrialOrdersConnectionString"), x => x.MigrationsHistoryTable("__MyMigrationsHistory", "trials")));
services.AddScoped(p => new ApplicationDbContext(p.GetService<DbContextOptions<ApplicationDbContext>>()));
//services.AddDbContext<AppDbContext_serie>(options => options.UseSqlServer(_config.GetConnectionString("Serie0ConnectionString")));

但当然,由于我并没有真正拥有其他模式的applicationDbContext,所以无法识别。

我试图重复另一个模式的应用程序数据库上下文,以获得模型并调用它们,但在我的迁移中,它再次创建了数据库:(我不希望这样。

我正在使用.Net Core和Angular。

要访问数据库中的表,但不能访问DbContext中的表时,可以尝试Query

例如。数据库有一个名为PersonNotInDbContext的表,该表在DbContext中不存在。

  • 数据库中的表

    CREATE TABLE [dbo].[PersonNotInDbContext] (
    [Id]   INT        NOT NULL,
    [Name] NCHAR (10) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
  • 定义一个新模型,该模型映射sql查询的返回列。

    public class TableNotInDbContext
    {
    public int Id { get; set; }
    public string Name { get; set; }
    }
    
  • DbContext中配置Query

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
    {
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    }
    public DbSet<TodoItem> TodoItem { get; set; }
    protected override void OnModelCreating(ModelBuilder builder)
    {
    base.OnModelCreating(builder);
    builder.Query<TableNotInDbContext>();
    }
    }
    
  • 使用

    public async Task<IActionResult> DbQuery()
    {
    var result = await _context.Query<TableNotInDbContext>()
    .FromSql($"Select * From PersonNotInDbContext")
    .ToListAsync();
    return Ok(result);
    }
    

    根据查询类型,您将能够从DbContext运行原始查询。

配置DI的方式为类型ApplicationDbContext配置了两个不同的实例。据我所知,这种行为将是:

ApplicationDbContext
  • 注入将注入第一个(AddDbContext定义(
  • 注射IEnumerable<ApplicationDbContext>将注入这两个上下文

注意:不确定注册类型的方式是否与注册相同在这种情况下,接口也可能是第二个寄存器覆盖第一个。

解决方法可能是创建一个从ApplicationDbContext继承的第二个DbContext类,然后使用第二个连接字符串设置第二个类。但在使用DI时,您必须知道要使用哪一个。

否则,自定义DbContextProvider可能是一个允许您选择使用哪个DbContext的解决方案。我发布了一个关于这个问题的示例代码:

在作为参数的asp.net核心web api中处理多个连接字符串

最新更新