从多个 DbContext 加入时 EF Core Table 不存在
EF Core Table does not exist when joining from multiple DbContext
我在尝试连接代表不同数据库的 2 个 DbContext 中的 2 个表时遇到问题。
我正在使用 Fluent API 在 2 个表之间创建外键关系。
这是 Dbcontext 配置和模型。
public class DbContextDemo1: DbContext
{
public DbSet<Agency> Agencies { get; set; }
public DbContextDemo1(DbContextOptions<DbContextDemo1> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("db1")
.Entity<Agency>()
.ToTable("agencies")
.HasKey(agency => agency.Id)
.HasOne(agency => agency.AgencyApp)
.WithOne(app => app.Agency)
.HasForeignKey<Agency>(agency => agency.Id);
}
}
public class DbContextDemo2: DbContext
{
public DbSet<AgencyApp> AgencyApps { get; set; }
public DbContextDemo2(DbContextOptions<DbContextDemo2> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("db2")
.Entity<AgencyApp>()
.ToTable("agenciesapps")
.HasKey(app => app .Id)
.HasOne(app=> app.Agency)
.WithOne(agency => agency.AgencyApp)
.HasForeignKey<AgencyApp>(app=> app.AgencyId);
}
}
以下是模型:
public class Agency
{
public Guid Id { get; set; }
public AgencyApp AgencyApp { get; set; }
}
public class AgencyApp
{
public Guid Id { get; set; }
public Guid AgencyId { get; set; }
public Agency Agency { get; set; }
}
现在,当我尝试获取 Agencies 数据和 AgencyApp 时。
var result = _dbContextDemo1.Agencies.Include(agency => agency.AgencyApplication)
它抛出一个错误
"Table 'db2.agenciesapps' doesn't exist".
我可以在服务器控制台中看到它正在这两个表之间进行内部连接。
非常感谢您的帮助。谢谢
不支持包含或连接来自不同上下文的表,因为
上下文可以连接到不同的数据库服务器。
不要使用不同的上下文,而是将实体添加到相同的上下文(为什么你甚至想要为它们设置两个不同的上下文?)
public class DbContextDemo1: DbContext
{
public DbSet<Agency> Agencies { get; set; }
public DbSet<AgencyApp> AgencyApps { get; set; }
public DbContextDemo1(DbContextOptions<DbContextDemo1> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("db1")
.Entity<Agency>()
.ToTable("agencies")
.HasKey(agency => agency.Id)
.HasOne(agency => agency.AgencyApp)
.WithOne(app => app.Agency)
.HasForeignKey<Agency>(agency => agency.Id);
modelBuilder.HasDefaultSchema("db1")
.Entity<AgencyApp>()
.ToTable("agenciesapps")
.HasKey(app => app .Id)
.HasOne(app=> app.Agency)
.WithOne(agency => agency.AgencyApp)
.HasForeignKey<AgencyApp>(app=> app.AgencyId);
}
}
如果您确实需要将它们放在两个不同的上下文中,那么您需要将所有实体提取到内存中,然后将它们连接在一起(这不是一个好主意,因为您需要将所有代理提取到内存)
var agencies = _dbContextDemo1.Agencies.ToList();
foreach(var agency in agencies)
{
agency.AgencyApps = _dbContextDemo2.AgencyApps.FirstOrDefault(a=> a.AgencyId == agency.Id);
}
您不能跨数据库加入。您必须使用两个单独的查询:
var agencies = await _dbContextDemo1.Agencies.ToListAsync();
var agencyApps = await _dbContextDemo2.AgencyApps.Where(x => agencies.Select(a => a.Id).Contains(x.AgencyId)).ToListAsync();
注意:由于您要 select 所有代理机构,因此从技术上讲,您也可以只 select 所有代理机构申请,但要按 select 代理机构的 ID 进行过滤如果您最终也过滤该集合,ed 会更好地工作。
然后您可以将第二个查询的数据映射到:
agencies.ForEach(x => x.AgencyApp = agencyApps.SingleOrDefault(a => a.AgencyId == x.Id));
我在尝试连接代表不同数据库的 2 个 DbContext 中的 2 个表时遇到问题。
我正在使用 Fluent API 在 2 个表之间创建外键关系。 这是 Dbcontext 配置和模型。
public class DbContextDemo1: DbContext
{
public DbSet<Agency> Agencies { get; set; }
public DbContextDemo1(DbContextOptions<DbContextDemo1> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("db1")
.Entity<Agency>()
.ToTable("agencies")
.HasKey(agency => agency.Id)
.HasOne(agency => agency.AgencyApp)
.WithOne(app => app.Agency)
.HasForeignKey<Agency>(agency => agency.Id);
}
}
public class DbContextDemo2: DbContext
{
public DbSet<AgencyApp> AgencyApps { get; set; }
public DbContextDemo2(DbContextOptions<DbContextDemo2> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("db2")
.Entity<AgencyApp>()
.ToTable("agenciesapps")
.HasKey(app => app .Id)
.HasOne(app=> app.Agency)
.WithOne(agency => agency.AgencyApp)
.HasForeignKey<AgencyApp>(app=> app.AgencyId);
}
}
以下是模型:
public class Agency
{
public Guid Id { get; set; }
public AgencyApp AgencyApp { get; set; }
}
public class AgencyApp
{
public Guid Id { get; set; }
public Guid AgencyId { get; set; }
public Agency Agency { get; set; }
}
现在,当我尝试获取 Agencies 数据和 AgencyApp 时。
var result = _dbContextDemo1.Agencies.Include(agency => agency.AgencyApplication)
它抛出一个错误
"Table 'db2.agenciesapps' doesn't exist".
我可以在服务器控制台中看到它正在这两个表之间进行内部连接。
非常感谢您的帮助。谢谢
不支持包含或连接来自不同上下文的表,因为 上下文可以连接到不同的数据库服务器。
不要使用不同的上下文,而是将实体添加到相同的上下文(为什么你甚至想要为它们设置两个不同的上下文?)
public class DbContextDemo1: DbContext
{
public DbSet<Agency> Agencies { get; set; }
public DbSet<AgencyApp> AgencyApps { get; set; }
public DbContextDemo1(DbContextOptions<DbContextDemo1> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("db1")
.Entity<Agency>()
.ToTable("agencies")
.HasKey(agency => agency.Id)
.HasOne(agency => agency.AgencyApp)
.WithOne(app => app.Agency)
.HasForeignKey<Agency>(agency => agency.Id);
modelBuilder.HasDefaultSchema("db1")
.Entity<AgencyApp>()
.ToTable("agenciesapps")
.HasKey(app => app .Id)
.HasOne(app=> app.Agency)
.WithOne(agency => agency.AgencyApp)
.HasForeignKey<AgencyApp>(app=> app.AgencyId);
}
}
如果您确实需要将它们放在两个不同的上下文中,那么您需要将所有实体提取到内存中,然后将它们连接在一起(这不是一个好主意,因为您需要将所有代理提取到内存)
var agencies = _dbContextDemo1.Agencies.ToList();
foreach(var agency in agencies)
{
agency.AgencyApps = _dbContextDemo2.AgencyApps.FirstOrDefault(a=> a.AgencyId == agency.Id);
}
您不能跨数据库加入。您必须使用两个单独的查询:
var agencies = await _dbContextDemo1.Agencies.ToListAsync();
var agencyApps = await _dbContextDemo2.AgencyApps.Where(x => agencies.Select(a => a.Id).Contains(x.AgencyId)).ToListAsync();
注意:由于您要 select 所有代理机构,因此从技术上讲,您也可以只 select 所有代理机构申请,但要按 select 代理机构的 ID 进行过滤如果您最终也过滤该集合,ed 会更好地工作。
然后您可以将第二个查询的数据映射到:
agencies.ForEach(x => x.AgencyApp = agencyApps.SingleOrDefault(a => a.AgencyId == x.Id));