将 DbContextOptions<dbContext> 传递给基本上下文

Posted

技术标签:

【中文标题】将 DbContextOptions<dbContext> 传递给基本上下文【英文标题】:Pass DbContextOptions<dbContext> to base context 【发布时间】:2018-08-07 21:01:41 【问题描述】:

我需要在两个单独的数据库中的两个表之间建立一对一的关系:db1.Assetdb2.AssetExtra。这个关系在数据库中是不存在的,所以我需要使用Fluent Api来设置,我是按照the documentation做的。

BaseContext.OnModelCreating(ModelBuilder modelBuilder) 包含此内容(为简洁起见,省略了其他内容):

modelBuilder.Entity<Asset>()
   .HasOne(a => a.AssetExtra)
   .WithOne(e => e.Asset)
   .HasForeignKey<AssetExtra>(e => e.AssetId);

Asset.cs 有一个AssetExtra 属性,AssetExtra.cs 有一个Asset 和一个AssetId 属性:

public partial class AssetExtra

    public int AssetId  get; set; 

    public Asset Asset  get; set; 


public partial class Asset

    public int AssetId  get; set; 

    public int AssetExtra  get; set; 

Startup.cs 中,每个上下文都注入了它的连接字符串:

services.AddDbContext<db1Context>(options => options.UseSqlServer(this.Configuration.GetConnectionString("db1")));
services.AddDbContext<db2Context>(options => options.UseSqlServer(this.Configuration.GetConnectionString("db2")));

按照this answer 中的示例,我正在尝试创建一个包含所有 DbSet 并为两个数据库设置所有模型关系的基本上下文:

public class BaseContext : DbContext
    
    public BaseContext(DbContextOptions<db1Context> options)
        : base(options)
    
    

    public BaseContext(DbContextOptions<db2Context> options)
        : base(options)
    
    


public class db1Context : BaseContext

    public db1Context()
    
    

    public db1Context(DbContextOptions<db1Context> options)
        : base(options)
    
    


public class db2Context : BaseContext

    public db2Context()
    
    

    public db2Context(DbContextOptions<db2Context> options)
        : base(options)
    
    

当我尝试使用 .Include() 将 AssetExtra 包含在 Asset 中时,出现运行时错误:

var assets = this.db1Context.Assets.Where(m => assetIds.Contains(m.AssetId))    
.Include(a => a.AssetExtra)
.ToList();

SqlException:无效的对象名称 Asset.AssetExtra。

我认为这是因为 AssetExtra 关系实际上并不存在于数据库中?我怎样才能让它工作?

【问题讨论】:

【参考方案1】:

恐怕你不能使用实体框架来做到这一点。它旨在用于一种上下文 - 一个数据库。关系必须配置为模型的一部分,这意味着它们必须指向您要连接的数据库中的有效对象。

你要找的是:

    不是有效的约束,因为约束存储在数据库中,并且只能引用存在于数据库模式中的项目。您提到这种关系不存在是有原因的,并且您希望通过代码来做到这一点,不是吗?我建议您阅读此问答:Add Foreign Key relationship between two Databases。 即使它存储在单个数据库中,也不是真正的逻辑关系,因为不可能对一对一所需的关系进行建模(想想哪个实体插入了另一个实体的 ID)。此问答可以提供更多详细信息:Entity Framework Code First One-to-One Required-Required Relationship

我认为您需要深入了解您想要实现的目标以及如何实现。

【讨论】:

我们最终将两个数据库合并为一个,部分基于此建议。谢谢!

以上是关于将 DbContextOptions<dbContext> 传递给基本上下文的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法转换为“Microsoft.EntityFrameworkCore.DbContextOptions”[关闭]

在 DbContextOptions 上找不到 UseMysql 方法

在 Startup.cs 中添加 DbContextOptions 未注册数据存储

我的DBC2000(64位版) dbc数据库异常是怎么回事求大神解答

带有 JPA 和 R2DBC 的 Spring Boot 2.4 混合项目无法启动

经典CAN2.0 DBC快速切换为CANFD DBC