我一直在尝试在应用程序中连接两个模式。
我将向您解释:我有一个使用自己表的应用程序,所以我通过迁移、模型和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中处理多个连接字符串