我有一个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");
}
...
}
因此,实体框架解释我的模型,两个用户之间的一个一对一的关系。
我怎样才能创建同一类型的实体之间的许多一对多的关系?
由于这是一个多对多的自我加入的关系,用户实体应该有一个Followers
和Following
的两种类型属性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_ID
和User_ID1
作为列名。