Одна таблица поиска распространяется на несколько классов - PullRequest
0 голосов
/ 08 января 2020

У меня есть следующая таблица с именем lookup. Эта таблица содержит все значения поиска для всей базы данных. Это первичные ключи категории и кода. Таблица предоставлена ​​сторонним поставщиком, и я не могу ее изменить.

| Category | Code | Descript |
------------------------------
| ACT      | 01   | Foo      |
------------------------------
| ACT      | 02   | Bar      |
------------------------------
| INCI_TYP | 01   | Fe       |
------------------------------
| INCI_TYP | 02   | Fi       |
------------------------------
| INCI_TYP | 03   | Fo       |
------------------------------

Я пишу API для этой базы данных и использую EF-Core для транзакций базы данных. Я создал (пока) два DBSet класса для этой таблицы поиска. Там будут еще десятки, чтобы следовать. Я думал, что мог бы создать Фильтры запросов для каждой категории в таблице поиска, чтобы мы могли легко получить доступ к значениям из таблицы поиска, поскольку поле категории не всегда очевидно или легко известно. Я создал один класс с именем ActivityTypeLookup, а другой - IncidentTypeLookup. Классы почти идентичны, поэтому я покажу код только для ActivityTypeLookup класса

[Table("lookup")]
public class ActivityTypeLookup
{
    public string Category { get; set; }
    public string Code { get; set; }
    [Column("descript")]
    public string Description { get; set; }
}

Оба класса имеют связанный класс IEntityTypeConfiguration, опять же, оба они почти идентичны, поэтому я буду только показать ActivityTypeLookup версию

public class ActivityTypeLookupConfiguration : IEntityTypeConfiguration<ActivityTypeLookup>
{
    public void Configure(EntityTypeBuilder<ActivityTypeLookup> builder)
    {
        builder.HasKey(c => c.Category);
        builder.HasKey(c => c.Code);
    }
}

В моем BaseDbContext у меня есть два следующих фильтра запросов:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IncidentTypeLookup>().HasQueryFilter(p => p.Category == "INCI_TYP");
    modelBuilder.ApplyConfiguration(new IncidentTypeLookupConfiguration());

    modelBuilder.Entity<ActivityTypeLookup>().HasQueryFilter(p => p.Category == "ACT");
    modelBuilder.ApplyConfiguration(new ActivityTypeLookupConfiguration());
}

Когда я впервые тестировал только с ActivityTypeLookup Созданный класс Я не получил ошибок, и таблица была отфильтрована так, как я этого хотел. Однако, когда я добавляю второй класс, IncidentTypeLookup, я получаю следующую ошибку:

System.InvalidOperationException: Невозможно использовать таблицу 'lookup' для типа сущности 'ActivityTypeLookup', так как он используется для тип сущности IncidentTypeLookup, и между их первичными ключами нет никакой связи.

Я искал идеи о том, как устранить ошибку, но большую часть того, что я видел, были ошибки рефакторинга или копирования / вставки. Возможно ли то, что я пытаюсь сделать с EF-Core 3.0? Если да, как я могу решить проблему, когда у меня есть несколько классов, обращающихся к одной и той же таблице?

...