Gibt es einen besseren Weg, um dieses Ziel zu erreichen, leicht abfragbare (und einbindbare) Querschnitte einer verwandten number-entity in derselben Tabelle zu haben?EF7 Implementieren TPH + M2M
Ich begann ohne TPH in der Join-Tabelle zu implementieren, aber das macht den einen oder anderen Typ in Abfragen mehr beteiligt, afaict.
// table Related: [Id]
public class Related
{
public Guid Id { get; set; }
public List<RelatedOther> RelatedOthers { get; set; } = new List<RelatedOther>();
public List<RelatedOtherOne> RelatedOtherOnes { get; set; } = new List<RelatedOtherOne>();
public List<RelatedOtherTwo> RelatedOtherTwos { get; set; } = new List<RelatedOtherTwo>();
}
// table RelatedOther: [RelatedId, OtherId, Type]
public abstract class RelatedOther
{
public Guid RelatedId { get; set; }
public Guid OtherId { get; set; }
public Related Related { get; set; }
public Other Other { get; set; }
public abstract RelatedOtherType Type { get; }
}
public class RelatedOtherOne : RelatedOther
{
public override RelatedOtherType Type => RelatedOtherType.One;
// should be unnecessary, 'Other' should be correct type
public OtherOne OtherOne { get; set; }
}
public class RelatedOtherTwo : RelatedOther
{
public override RelatedOtherType Type => RelatedOtherType.Two;
// should be unnecessary, 'Other' should be correct type
public OtherTwo OtherTwo { get; set; }
}
public enum RelatedOtherType : int
{
One = 1,
Two = 2
}
// table Other: [Id, OneProp, TwoProp]
public abstract class Other
{
public Guid Id { get; set; }
public List<RelatedOther> RelatedOthers { get; set; } = new List<RelatedOther>();
}
public class OtherOne : Other
{
public string OneProp { get; set; }
}
public class OtherTwo : Other
{
public string TwoProp { get; set; }
}
TPH ist like this
abgebildet M2M like this + Diskriminator in Haskey abgebildet wird()
Dies wird sogar noch komplizierter (wenn nicht unmöglich?) Wenn das Unternehmen entwickelt sich zu einer TPH-Strategie 'Verwandte' wie das andere'.
Ich entschied, dass, wenn die Enden der m2m-Assoziation TPH sind, die Join-Tabelle selbst diesen TPH widerspiegeln sollte, unabhängig davon, ob ich die Navigationseigenschaften für alle diese TPH-Typen auf beiden Seiten offenlege oder nicht. Es ist nur ein sauberes Design imo. Dies ermöglicht dann dem Framework, die Übersetzung der Navigationseigenschaft, die Sie als '[NotMapped]' verwenden, mit dem Cast zu behandeln. – JoeBrockhaus
Und wenn ich 'abstract' auf meiner Basisklasse verwende, hindert es mich nicht daran, nur diesen Basistyp abzufragen - wenn die Abfrage mehr als einen abgeleiteten Typ als Ergebnismenge ergibt, instanziiert EF den korrekten abgeleiteten Typ und die Instanz in dem entsprechenden abgeleiteten Typ wird automatisch mit dieser Instanz gefüllt. Wenn Ihr Modell 2 (und nur 2) abgeleitete Typen hat, sollte die Basisklasse abstrakt sein. Eine Instanz von Event2Location ohne einen EventType-Diskriminatorwert macht keinen Sinn, richtig? Sie sollten daher niemals eine Vanilla-Instanz von Event2Location erstellen können. – JoeBrockhaus