2016-09-27 74 views
1

我有一个Ticket实体:自参照许多一对多的关系

public class Ticket 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 

     public virtual ICollection<Relation> RelatedTickets { get; set; } 
    } 

我想设置实体框架中的核心多到很多自我的关系,所以我做了两个一到多关系:

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:

 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); 

但结果我有一个错误:

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

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是这样的:

modelBuilder.Entity<Ticket> => 
{ 
    entity 
     .HasMany(e => e.RelatedTickets) 
     .WithOne(e => e.ParentRelation) 
     .HasForeignKey(e => e.ParentRelationId); 
}); 

但它看起来 '脏' 到存储这样的父母关系。
什么是正确的方法?

+0

我不确定你的“关系”类是必需的,因为它只描述关系而没有其他有意义的数据。我会像这样建模:'public virtual ICollection RelatedTickets {get;组; },而英孚将执行这些关系。 –

+0

@Mr Anderson它可能有其他数据,您的解决方案我无法控制'卧底'结构和FK名称 – Ice2burn

回答

1

不可能只有一个关系集合。您需要两张关系票等于TicketFrom,第二张关票等于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

+0

其实我正在考虑这个问题,但我的注意力集中在单一的多对多集合上。我想两种一对多关系最适合我的情况。应该休息一下,谢谢! – Ice2burn