将 DbContextOptions<dbContext> 传递给基本上下文
Posted
技术标签:
【中文标题】将 DbContextOptions<dbContext> 传递给基本上下文【英文标题】:Pass DbContextOptions<dbContext> to base context 【发布时间】:2018-08-07 21:01:41 【问题描述】:我需要在两个单独的数据库中的两个表之间建立一对一的关系:db1.Asset 和 db2.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数据库异常是怎么回事求大神解答