EF Core - извлечение данных из двух идентичных таблиц - PullRequest
0 голосов
/ 15 февраля 2020

TLDR: у меня есть две таблицы с одинаковыми определениями, и мне нужно вытащить из одной таблицы или другую в зависимости от какого-то переключателя.

Например, предположим, что таблица с набором «generi c» FooItem и таблица с «Fancy» FooItem ... и единственное различие между двумя таблицами - это имена, SIMPLE_FOO и FANCY_FOO

В зависимости от логического значения, такого как GetFancy == true, я должен читать из FANCY_FOO, в противном случае SIMPLE_FOO.

Это усложняется в DbContext. У меня не может быть более одного DbSet<FooItem> в моем контексте, и я не могу динамически «вставить» имя таблицы в ModelBuilder.Entity<FooItem>(e => e.ToView("pickOne")) ... и я не хочу дублировать весь dbContext просто для того, чтобы иметь другое имя таблицы там.

Я уверен, что решение простое, но я просто не вижу его. Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Я не могу изменить базу данных. Это глупый способ сделать это, но так они и сделали, и я должен с этим жить.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

По моему мнению, проще всего использовать метод .FromSql() и использовать его для выбора таблицы:

var foos = GetFancy
  ? dbContext.FromSql(select * from FANCY_FOO)
  : dbContext.FromSql(select * from SIMPLE_FOO)

return foos.Where(/* etc /*)
0 голосов
/ 15 февраля 2020

Просто включите две сущности в ваше решение, по одной для каждой таблицы. Они могут наследовать от базового класса, поскольку они идентичны. Создайте свой базовый класс «BaseFooItem», который имеет все поля в обеих таблицах. Затем создайте класс сущностей для каждого из вариантов (Простой и Необычный) и аннотируйте каждый для соответствия необходимому имени таблицы; Например:

[Table("SIMPLE_FOO")]
public class SimpleFooItem: BaseFooItem {
}

Если вы не хотите использовать аннотации данных, вы также можете задать имя таблицы с помощью FluentAPI. Затем создайте DbSet для каждой сущности:

    public DbSet<SimpleFooItem> SimpleFooItems { get; set; }
    public DbSet<FancyFooItem> FancyFooItems { get; set; }

Затем выполните условное переключение между каждым DbSet, например:

if (GetFancy) {
   return dbContext.FancyFooItems.SingleOrDefault(a => a.Id == id);
} else {
   return dbContext.SimpleFooItems.SingleOrDefault(a => a.Id == id);
}

Надеюсь, я правильно понимаю ваши потребности.

...