Думайте об этом с точки зрения реляционных данных.Как база данных узнает, на какую таблицу указывает «Идентификатор элемента»?Как это будет проиндексировано?
Это будет случай использования нулевого FK для каждой связанной таблицы в бронировании.Эти FK не обязательно должны находиться в объекте, только свойства навигации.Вы можете использовать .Map(x => x.MapKey)
в EF6 или .HasForeignKey("")
в EF Core для использования свойства тени.
Это не применяется, если вы хотите, чтобы бронирование было связано только с курсом или подарочной картой, но не с обоими,Это необходимо учитывать на уровне приложений, и я бы рекомендовал использовать задачу планового обслуживания для оценки данных на предмет нарушений этого правила.(Например, ищите бронирования, содержащие как идентификатор курса, так и идентификатор подарочной карты)
В качестве альтернативы вы можете оставить объединения "свободными" и проанализировать их с помощью приложения на основе дискриминатора, аналогичного модели наследования.(ItemId + ItemType) Однако вы должны разрешить загрузку отношений отдельно в вашем приложении на основе ItemType и потерять все FK, индексацию и проверки целостности данных в базе данных.Это может быть значительным расходом на производительность и обслуживание, чтобы сэкономить, добавив пару FK.