elbstreferenzierung von Many-to-Many-Beziehung
Ich habe einTicket
Entität
public class Ticket
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Relation> RelatedTickets { get; set; }
}
Ich möchte viele-zu-viele-Selbstbeziehungen in Entity Framework Core einrichten, also habe ich zwei Eins-zu-viele-Beziehungen erstellt:
public class Relation
{
[Required, ForeignKey("TicketFrom")]
public int FromId { get; set; }
[Required, ForeignKey("TicketTo")]
public int ToId { get; set; }
public virtual Ticket TicketFrom { get; set; }
public virtual Ticket TicketTo { get; set; }
}
Ich habe versucht, die Beziehung mithilfe einer flüssigen API zu erstellen:
builder.Entity<Relation>()
.HasKey(uc => new { uc.FromId, uc.ToId });
builder.Entity<Relation>()
.HasOne(c => c.TicketFrom)
.WithMany(p => p.RelatedTickets)
.HasForeignKey(pc => pc.FromId);
builder.Entity<Relation>()
.HasOne(c => c.TicketTo)
.WithMany(p => p.RelatedTickets)
.HasForeignKey(pc => pc.ToId);
Aber im Ergebnis habe ich einen Fehler:
Kann keine Beziehung zwischen 'Ticket.RelatedTickets' und 'Relation.TicketTo' erstellen, da bereits eine Beziehung zwischen 'Ticket.RelatedTickets' und 'Relation.TicketForm' besteht. Navigationseigenschaften können nur an einer einzelnen Beziehung teilnehmen.
Die mögliche Lösung besteht darin, die übergeordnete Beziehung direkt zu @ hinzuzufügeTicketEntity
:
public class Ticket
{
public int Id { get; set; }
[Required, ForeignKey("ParentRelation")]
public Nullable<int> ParentRelationId { get; set; }
public virtual Ticket ParentRelation {get;set;}
public virtual ICollection<Ticket> RelatedTickets { get; set; }
...
}
Mit fließendem API wie folgt:
modelBuilder.Entity<Ticket> =>
{
entity
.HasMany(e => e.RelatedTickets)
.WithOne(e => e.ParentRelation)
.HasForeignKey(e => e.ParentRelationId );
});
Aber es sieht 'schmutzig' aus, eine Elternbeziehung wie diese zu speichern.
Was ist der richtige Ansatz?