All, Ist es möglich, dieselbe FK für zwei Tabellen zu verwenden. Wahrscheinlich ist es keine gute Praxis, aber ich habe zwei verschiedene Klassen, die beide gebucht werden können:
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; }
}
Betrachten Sie es aus der relationalen Datenperspektive. Woher weiß die Datenbank, auf welche Tabelle eine "Artikel-ID" verweist? Wie würde es indizieren?
Dies wäre der Fall, wenn für jede verwandte Tabelle in der Buchung ein nullfähiger FK verwendet wird. Diese FKs müssen sich nicht in der Entität befinden, sondern nur in den Navigationseigenschaften. Sie können .Map(x => x.MapKey)
in EF6 oder .HasForeignKey("")
in EF Core verwenden, um eine Schatteneigenschaft zu nutzen.
Dies gilt nicht, wenn Sie möchten, dass eine Buchung nur einem Kurs oder einer Geschenkkarte zugeordnet wird, nicht jedoch beiden. Dies muss auf der Anwendungsebene berücksichtigt werden, und ich würde empfehlen, eine geplante Wartungsaufgabe zu verwenden, um die Daten auf Verstöße gegen diese Regel auszuwerten. (Suchen Sie nach Buchungen, die beispielsweise eine Kurs-ID und eine Geschenkkarten-ID enthalten.)
Sie können alternativ die Verknüpfungen "lose" lassen und von der Anwendung basierend auf einem Diskriminator ähnlich einem Vererbungsmodell ausgewertet werden. (ItemId + ItemType) Sie müssen jedoch die Beziehungslast in Ihrer Anwendung basierend auf dem ItemType separat auflösen und bei FK-, Indizierungs- und Datenintegritätsprüfungen in der Datenbank verlieren. Dies könnte zu erheblichen Leistungs- und Wartungskosten führen, wenn Sie ein paar FKs hinzufügen müssen.