自引用多对多关系 [英] Self Referencing Many-to-Many relations
问题描述
我有一个Ticket
实体:
public class Ticket
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Relation> RelatedTickets { get; set; }
}
我想在Entity Framework Core中设置多对多自相关,所以我建立了两个一对多关系:
I want to setup many-to-many self-relations in Entity Framework Core, so i made two one-to-many relations:
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; }
}
我尝试使用流利的API创建关系:
I've tried to create the relationship using fluent API:
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);
但是结果是我有一个错误:
But in result i have an error:
无法在"Ticket.RelatedTickets"和 'Relation.TicketTo',因为之间已经存在关系 "Ticket.RelatedTickets"和"Relation.TicketForm".导航 属性只能参与单个关系.
Cannot create a relationship between 'Ticket.RelatedTickets' and 'Relation.TicketTo', because there already is a relationship between 'Ticket.RelatedTickets' and 'Relation.TicketForm'. Navigation properties can only participate in a single relationship.
可能的解决方案是直接将父关系添加到TicketEntity
:
The possible solution is to add Parent relation directly to TicketEntity
:
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; }
...
}
使用这样的流利的api:
With fluent api like this:
modelBuilder.Entity<Ticket> =>
{
entity
.HasMany(e => e.RelatedTickets)
.WithOne(e => e.ParentRelation)
.HasForeignKey(e => e.ParentRelationId );
});
但是存储这样的父关系看起来很肮脏".
什么是正确的方法?
But it looks 'dirty' to store parent relation like this.
What is the right approach?
推荐答案
不可能只有一个具有关系的集合.您需要两个-一个与票证等于TicketFrom
的关系,第二个与票证等于TicketTo
的关系.
It's not possible to have just one collection with relations. You need two - one with relations the ticket equals TicketFrom
and second with relations the ticket equals TicketTo
.
类似这样的东西:
型号:
public class Ticket
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Relation> RelatedTo { get; set; }
public virtual ICollection<Relation> RelatedFrom { get; set; }
}
public class Relation
{
public int FromId { get; set; }
public int ToId { get; set; }
public virtual Ticket TicketFrom { get; set; }
public virtual Ticket TicketTo { get; set; }
}
配置:
modelBuilder.Entity<Relation>()
.HasKey(e => new { e.FromId, e.ToId });
modelBuilder.Entity<Relation>()
.HasOne(e => e.TicketFrom)
.WithMany(e => e.RelatedTo)
.HasForeignKey(e => e.FromId);
modelBuilder.Entity<Relation>()
.HasOne(e => e.TicketTo)
.WithMany(e => e.RelatedFrom)
.HasForeignKey(e => e.ToId);
请注意,使用父级的解决方案并不等效,因为它会创建one-to-many
关联,而如果我理解正确,那么您正在寻找many-to-many
.
Note that a solution using Parent is not equivalent, because it would create one-to-many
association, while if I understand correctly you are seeking for many-to-many
.
这篇关于自引用多对多关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!