[Q:] Возможно ли использовать FK в качестве дискриминатора в EF и какие обходные методы возникают у людей?
Сценарий
Объекты EF
public class List
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<ListItem> Items { get; set; }
}
public abstract class ListItem
{
public int Id { get; set; }
public List List { get; set; }
public string Text { get; set; }
}
База данных
Существующий БД, который не используется исключительно EF (т.е. не может быть изменен) имеет следующие поля:
List
Id int not null (identity)
Name varchar
ListItem
Id int not null (identity)
ListId int not null (FK to List.Id)
Text varchar
Желаемый результат
Я хочу, чтобы идентификатор списка был дискриминатором для ListItem. т.е. для каждой записи в списке реализован отдельный класс, происходящий из ListItem.
Например, для List [Id: 1]
public class PersonListItem : ListItem
{
public int PersonId { get; set; }
public Person Person { get; set; }
}
public class ListItemConfiguration : EntityTypeConfiguration<ListItem>
{
Map<PersonListItem>(m => m.Requires("ListId").HasValue(1));
}
В приведенном выше сценарии сохранение изменений приводит к исключению SQL, поскольку EF пытается вставить в List_Id при создании нового экземпляра ListItem. List_Id не является полем, и я не могу сопоставить ListId как свойство в ListItem, так как не мог бы использоваться в качестве дискриминатора.
Мое решение до сих пор...
Этот Q & A объясняет, почему они приняли решение не разрешать FK как дискриминатор.
Мое обходное решение до сих пор заключается в добавлении другого поля в db для использования в качестве дискриминатора, который затем устанавливается на то же значение, что и ListId, с помощью триггера insert (для обработки не-EF-вставок), а затем добавляет навигационное свойство ListId к Объект ListItem.
Есть ли у кого-нибудь предложения/альтернативы?