我一直试图在我的应用程序中建立两个模式的连接。
我将向您解释:我有一个使用自己表的应用程序,因此我使用迁移和模型以及DbContext
创建了表,然后将表托管在具有其他架构的SQL Server数据库中从其他应用程序,一切都很好。单个应用程序连接并接收数据。
但是我的应用程序需要连接到我在SQL Server数据库中拥有的其他架构之一,另一个架构具有相同的连接字符串,因为它们位于同一服务器中。
我还在startup.cs / ConfigureServices
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。
答案 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
运行原始查询。