У меня есть следующая таблица с именем 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? Если да, как я могу решить проблему, когда у меня есть несколько классов, обращающихся к одной и той же таблице?