Мне нужно установить взаимно-однозначную связь между двумя таблицами, которые находятся в двух отдельных базах данных: db1.Asset и db2.AssetExtra. Эта связь не существует в базе данных, поэтому мне нужно настроить ее с помощью 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")));
Следуя примеру этот ответ, я пытаюсь создать один базовый контекст, который содержит все DbSets и устанавливает все отношения моделей для обеих баз данных:
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 на самом деле не существует в базе данных? Как я могу заставить это работать?
Боюсь, вы не можете сделать это с помощью Entity Framework. Он предназначен для использования одного контекста - одной базы данных. Отношения должны быть настроены как часть модели, что означает, что они должны указывать на допустимые объекты в базе данных, к которой вы подключаетесь.
Вы ищете:
Я думаю, вам нужно внимательно посмотреть, чего вы пытаетесь достичь и как.
В итоге мы объединили две базы данных в одну, частично основываясь на этом предложении. Спасибо!