这就是我想要实现的目标:
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的追随者和追随者。如何去做。答案 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,因为你想表示两个人之间的关系。
如果您询问我对您应该选择哪个选项的意见,我建议您不要映射联结表,如果您只有那些属性。