在MVC3相同类型的实体之间的许多一对多的关系(Many-to-many relationship

2019-06-24 03:50发布

我有一个ASP.NET MVC3应用程序,在这里我使用实体框架4.3代码优先和迁移。

我一直在试图创建同一类型的实体之间的许多一对多的关系,但是当我脚手架迁移与迁移,它产生一比一的关系。

这个想法是,一个用户应该能够遵循多个其他用户(认为Twitter的)。

我的User模型是这个样子:

public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public DateTime Registered { get; set; }
    ...
    public virtual ICollection<User> Follows { get; set; }
}

当我在脚手架增加跟随属性,我得到这样一个迁移:

public partial class FollowUser : DbMigration
{
    public override void Up()
    {
        AddColumn("User", "User_UserId", c => c.Int());
        AddForeignKey("User", "User_UserId", "User", "UserId");
        CreateIndex("User", "User_UserId");
    }

    ...
}

因此,实体框架解释我的模型,两个用户之间的一个一对一的关系。

我怎样才能创建同一类型的实体之间的许多一对多的关系?

Answer 1:

由于这是一个多对多的自我加入的关系,用户实体应该有一个FollowersFollowing的两种类型属性User 。 所以,让我们改变你的类包括那些

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }       
    public virtual ICollection<User> Followers { get; set; }
    public virtual ICollection<User> Following { get; set; }
}

现在更新的DbContext类,以便它返回一个用户属性

 public DbSet<User> Users { set; get; }

我们需要告诉的EntityFramework,我们需要有一个许多人在这两者之间的关系很多船。 所以,让我们做,与流利的API通过覆盖OnModelCreating方法

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().HasMany(m => m.Followers).WithMany(p => p.Following).Map(w => w.ToTable("User_Follow").MapLeftKey("UserId").MapRightKey("FollowerID"));
    base.OnModelCreating(modelBuilder);
}

现在,实体框架将创建一个这样的表。

请注意,我们明确告诉实体框架使用的用户名FollowerId作为Forign键列名。 如果我们还没有提到的是,EF将使用User_IDUser_ID1作为列名。



文章来源: Many-to-many relationship between entities of same type in MVC3