【问题标题】:Entity Framework : two database schemas, one without db context实体框架:两种数据库模式,一种没有数据库上下文
【发布时间】:2019-05-06 03:29:27
【问题描述】:

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

我会向你解释:我有一个使用自己的表的应用程序,所以我使用迁移和模型和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。

【问题讨论】:

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


    【解决方案1】:

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

    • ApplicationDbContext 的注入将注入第一个 (AddDbContext 定义)。
    • 注入 IEnumerable&lt;ApplicationDbContext&gt; 将同时注入两种上下文。

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

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

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

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

    【讨论】:

      【解决方案2】:

      要访问数据库中的表,而不是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);
        }
        

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        相关资源
        最近更新 更多