Auto-referenciando relações muitos-para-muitos
eu tenho umTicket
entidade:
public class Ticket
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Relation> RelatedTickets { get; set; }
}
Quero configurar relações pessoais muitos para muitos no Entity Framework Core, por isso fiz duas relações um para muitos:
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; }
}
Eu tentei criar o relacionamento usando API fluente:
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);
Mas, como resultado, tenho um erro:
Não é possível criar um relacionamento entre 'Ticket.RelatedTickets' e 'Relation.TicketTo', porque já existe um relacionamento entre 'Ticket.RelatedTickets' e 'Relation.TicketForm'. As propriedades de navegação podem participar apenas de um único relacionamento.
A solução possível é adicionar a relação pai diretamente aoTicketEntity
:
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; }
...
}
Com API fluente como esta:
modelBuilder.Entity<Ticket> =>
{
entity
.HasMany(e => e.RelatedTickets)
.WithOne(e => e.ParentRelation)
.HasForeignKey(e => e.ParentRelationId );
});
Mas parece "sujo" armazenar a relação dos pais assim.
Qual é a abordagem correta?