我需要在两个独立数据库中的两个表之间建立一对一关系: 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
具有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关系实际上不在数据库中?我该如何工作?
答案 0 :(得分:2)
恐怕您无法使用Entity Framework进行此操作。它旨在用于一种上下文-一种数据库。关系必须配置为模型的一部分,这意味着它们必须指向您要连接到的数据库中的有效对象。
您正在寻找的是:
我认为您需要深入了解您要实现的目标以及如何实现。