Я унаследовал базу данных SQL Server, где исходный разработчик использовал одну таблицу для представления всех типов "поиска" вместо того, чтобы указывать таблицу для каждого ...
create table Lookup (
LookupID int,
LookupType int,
LookupKey int,
LookupValue varchar(50)
)
Затем таблица используется (например) для предоставления различных списков на основе LookupType, чтобы вы могли видеть такие данные, как ...
ID Type Key Value
1 1 1 Mr
2 1 2 Mrs
3 1 3 Miss
4 2 1 Dog
5 2 2 Cat
6 2 3 Hamster
Мне нужно использовать эту таблицу с Entity Framework Core, поскольку я хочу иметь возможность возвращать значения поиска при запросе данных. Возьмем, к примеру, следующую таблицу ...
create table Customer (
CustomerID int,
CustomerTitleID int, <- LookupType = 1
PetTypeID int -- LookupType = 2
)
И данные будут выглядеть так ...
ID TitleID PetTypeID
1 1 1
Я могу определить класс «Поиск» ...
public class Lookup {
public int LookupID {get; set;}
public int LookupTypeID {get; set;}
public int LookupKey {get; set;}
public string LookupValue {get; set;}
}
И я могу определить класс «Клиент» ...
public class Customer {
public int CustomerID {get; set;}
public Lookup CustomerTitle {get; set;}
public int CustomerTitleID {get; set;}
public Lookup PetType {get; set;}
public int PetTypeID {get; set;}
}
Проблема в том, что хотя (в DbContext.OnModelCreating) я могу указать «Принципиальный ключ» для отношений «Клиент / Поиск» ...
entity<Customer>().HasOne<Lookup>(c => c.CustomerTitle).WithMany().WithForeignKey(c => c.CustomerTitleID).WithPrincipleKey(l => l.LookupKey);
entity<Customer>().HasOne<Lookup>(c => c.PetType).WithMany().WithForeignKey(c => c.PetTypeID).WithPrincipleKey(l => l.LookupKey);
Я не могу найти способ установить фильтр для каждого класса «Lookup», чтобы ограничить его «LookupTypeID».
Я попытался создать собственный класс «PetType» и связать его с «Lookup» вместе с фильтром (в DbContext.OnModelCreating) ...
entity.HasQueryFilter(lookup => lookup.LookupType == 2);
однако EF не хочет, чтобы с таблицей было связано более одного типа сущности, если только типы сущностей также не связаны («PetType» должен быть унаследован от «Lookup»).
Затем я унаследовал этот настраиваемый класс «PetType» от «Lookup» и попробовал тот же фильтр ...
entity.HasQueryFilter(petType=> petType.LookupType == 2);
но EF разрешит такой фильтр только на корневом уровне.
Я также пробовал использовать представления, однако, хотя объект DbSet может быть дочерним свойством объекта DbQuery, похоже, что это не работает наоборот.
Я скучаю по другому пути? Конечный результат, которого я пытаюсь достичь, это ...
from customer in dbContext.Customers
.Select new
{
customer.CustomerID,
Title = customer.CustomerTitle.LookupValue,
PetType = customer.PetType.LookupValue
}
и EF автоматически применяет фильтр к каждому поиску (очевидно, указанному мной), чтобы выбрать правильные строки.