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

时间:2018-12-04 16:28:35

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

我一直试图在我的应用程序中建立两个模式的连接。

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

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

我还在startup.cs / ConfigureServices

中编写了2 db上下文。
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。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

Handling multiple connection strings in asp.net core web api which came as a parameter

答案 1 :(得分:0)

要访问数据库中的表,但不能访问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; }
    }
    
  • Query中配置DbContext

    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);
    }
    

    通过Query Types,您将能够从DbContext运行原始查询。