将DbContextOptions <dbcontext>传递到基本上下文

时间:2018-08-07 21:01:42

标签: c# entity-framework-core

我需要在两个独立数据库中的两个表之间建立一对一关系: db1.Asset db2.AssetExtra 。该关系在数据库中不存在,因此我需要使用我根据the documentation完成的Fluent Api进行设置。

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具有AssetAssetId属性:

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 个答案:

答案 0 :(得分:2)

恐怕您无法使用Entity Framework进行此操作。它旨在用于一种上下文-一种数据库。关系必须配置为模型的一部分,这意味着它们必须指向您要连接到的数据库中的有效对象。

您正在寻找的是:

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

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