EF Core Table не существует при объединении из нескольких DbContext - PullRequest
0 голосов
/ 09 октября 2018

Я столкнулся с проблемой при попытке объединить 2 таблицы из 2 DbContext, которые представляют разные базы данных.

Я использую 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; }
}

Теперь, когда я пытаюсь получить данные агентств вместе с AgencyApp.

var result = _dbContextDemo1.Agencies.Include(agency => agency.AgencyApplication)

Выдает ошибку

"Таблица 'db2.agenciesapps' не существует".

Я вижу, что в консоли сервера выполняется внутреннее соединение между этими двумя таблицами.

Помощь будет весьма полезна.Спасибо

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы не можете объединяться между базами данных.Вам нужно будет использовать два отдельных запроса:

var agencies = await _dbContextDemo1.Agencies.ToListAsync();
var agencyApps = await _dbContextDemo2.AgencyApps.Where(x => agencies.Select(a => a.Id).Contains(x.AgencyId)).ToListAsync();

Примечание. Поскольку вы выбираете все агентства, технически вы можете просто выбрать все приложения агентств, но с фильтрацией по идентификаторам агентств, которые былиВыбранный вариант работает лучше, если вы в конечном итоге также отфильтруете этот набор.

Затем вы можете отобразить данные из второго запроса:

agencies.ForEach(x => x.AgencyApp = agencyApps.SingleOrDefault(a => a.AgencyId == x.Id));
0 голосов
/ 09 октября 2018

Включение или объединение таблиц из разных контекстов не поддерживается, поскольку контексты могут быть подключены к разным серверам БД.

Вместо использования другого контекста, добавьте сущности в один и тот же контекст ( Зачем вам нужно иметь два разных контекста для них? )

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);
}
...