如何在其中配置与主键的多对多关系

时间:2016-01-06 13:14:42

标签: asp.net-mvc entity-framework code-first ef-migrations

这就是我想要实现的目标:

  modelBuilder.Entity<ApplicationUser>()      
                    .HasMany(u => u.Following)
                    .WithMany(u => u.Followers)
                    .Map(m =>
                            {
                                m.ToTable("FollowTables");
                                m.MapLeftKey("UserId");
                                m.MapRightKey("FollowId");
                            });

在应用程序用户类中,我已经配置了以下内容和关注者:

public ICollection<ApplicationUser> Following { get; set; }
public ICollection<ApplicationUser> Followers { get; set; }

关注表应该是这样的:

 public class FollowTable
 {
    [Key]
    public int autoId { get; set; }
    public int UserId { get; set; }
    public int? FollowId { get; set; }
 }

autoId是主键,UserId和FollowId都是ApplicationUser类的外键,其中UserId是用户自己的id,FollowId是用户关注的ID。它的数据可能如下:

  autoId  UserId  FollowId
   1        4        11
   2        4        12
   3        4        13

现在,我的问题是当我通过pmc更新数据库时,它创建了两个数据库表,一个是FollowTables with column(USerId,FollowId),另一个是FollowTables1(autoId,USerId,FollowId)。

如果我从applicationDbContext类中删除此行:

public DbSet<FollowTable> FollowTables { get; set; }

然后它只创建一个表但没有主键。

请某人帮助我。如何正确配置UserId和followId作为外键,这两个应该映射到ApplicationUser的Id。 我也想使用那些Collection的追随者和追随者。如何去做。

1 个答案:

答案 0 :(得分:1)

您必须决定是否要使用代表联结表的实体。如果您不需要向该表添加任何其他属性(不包括FK),那么我建议您不要将联结表映射为实体。由于Entity Framework将为您处理该表,因此对您来说会更容易。

现在,如果您确实需要映射该表,那么您需要删除多对多流畅的api配置并更改导航属性的类型:

public ICollection<FollowTable> Following { get; set; }
public ICollection<FollowTable> Followers { get; set; }  

这将与联结表创建两个一对多关系,这是多对多关系的显式表示。为此,您还需要在该实体中进行一些更改:

public class FollowTable
{
  [Key]
  public int autoId { get; set; }

  public int UserId { get; set; }
  [ForeignKey("User")]
  public ApplicationUser User{ get; set; }

  [ForeignKey("Follow")]
  public int? FollowId { get; set; }
  public ApplicationUser Follow{ get; set; }
}

另外,我认为FollowId Fk属性不应该是可以为空的FK,因为你想表示两个人之间的关系。

如果您询问我对您应该选择哪个选项的意见,我建议您不要映射联结表,如果您只有那些属性。