Autorreferenciación de relaciones de muchos a muchos
Yo tengo unTicket
entidad:
public class Ticket
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Relation> RelatedTickets { get; set; }
}
Quiero configurar auto-relaciones de muchos a muchos en Entity Framework Core, así que hice dos relaciones uno a muchos:
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; }
}
Intenté crear la relación usando una API fluida:
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);
Pero como resultado tengo un error:
No se puede crear una relación entre 'Ticket.RelatedTickets' y 'Relation.TicketTo', porque ya existe una relación entre 'Ticket.RelatedTickets' y 'Relation.TicketForm'. Las propiedades de navegación solo pueden participar en una sola relación.
La posible solución es agregar la relación principal directamente aTicketEntity
:
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; }
...
}
Con una API fluida como esta:
modelBuilder.Entity<Ticket> =>
{
entity
.HasMany(e => e.RelatedTickets)
.WithOne(e => e.ParentRelation)
.HasForeignKey(e => e.ParentRelationId );
});
Pero parece 'sucio' almacenar la relación de padres de esta manera.
¿Cuál es el enfoque correcto?