Структура объекта один внешний ключ к двум таблицам - сначала код - PullRequest
0 голосов
/ 30 января 2019

All, возможно ли использовать один и тот же FK для двух таблиц.Возможно, это не очень хорошая практика, но у меня есть два разных класса, которые можно забронировать оба:

public class Course {

    public Course() {
        BookingRefs = new HashSet<BookingRef>();
    }

    public long Id { get; set; }
    public string Title { get; set; }
    // other props ...

    [InverseProperty(nameof(BookingRef.Course))]
    public virtual ICollection<BookingRef> BookingRefs { get; set; }
}

public class GiftCard {

    public GiftCard() {
        BookingRefs = new HashSet<BookingRef>();
    }

    public long Id { get; set; }
    public string Prop1 { get; set; }
    public int Prop2 { get; set; }
    // other props ...

    [InverseProperty(nameof(BookingRef.Course))]
    public virtual ICollection<BookingRef> BookingRefs { get; set; }
}

// this is the bookin reference for a Course or an GiftCard
public class BookingRef {

    public BookingRef() {
    }

    public long Id { get; set; }
    // other props ...

    /// <summary>The item (usually the course but theoretically anything with a long id)</summary>
    public long? ItemId { get; set; }

    // maybe a generic Object?
    [ForeignKey(nameof(ItemId))]
    public Object GiftCard { get; set; }

    // maybe 2 items possibly null?
    [ForeignKey(nameof(ItemId))]
    public Course Course { get; set; }

    // maybe 2 items possibly null?
    [ForeignKey(nameof(ItemId))]
    public GiftCard GiftCard { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Думайте об этом с точки зрения реляционных данных.Как база данных узнает, на какую таблицу указывает «Идентификатор элемента»?Как это будет проиндексировано?

Это будет случай использования нулевого FK для каждой связанной таблицы в бронировании.Эти FK не обязательно должны находиться в объекте, только свойства навигации.Вы можете использовать .Map(x => x.MapKey) в EF6 или .HasForeignKey("") в EF Core для использования свойства тени.

Это не применяется, если вы хотите, чтобы бронирование было связано только с курсом или подарочной картой, но не с обоими,Это необходимо учитывать на уровне приложений, и я бы рекомендовал использовать задачу планового обслуживания для оценки данных на предмет нарушений этого правила.(Например, ищите бронирования, содержащие как идентификатор курса, так и идентификатор подарочной карты)

В качестве альтернативы вы можете оставить объединения "свободными" и проанализировать их с помощью приложения на основе дискриминатора, аналогичного модели наследования.(ItemId + ItemType) Однако вы должны разрешить загрузку отношений отдельно в вашем приложении на основе ItemType и потерять все FK, индексацию и проверки целостности данных в базе данных.Это может быть значительным расходом на производительность и обслуживание, чтобы сэкономить, добавив пару FK.

0 голосов
/ 30 января 2019

Можно ли использовать один и тот же FK для двух таблиц

Нет.Реляционная модель этого не позволяет.Вы можете представить суперкласс всех ваших вещей, которые можно забронировать, и иметь FK для этого, но вы не должны этого делать, просто получив одну коллекцию, а не несколько.

...