c# - MVC3中相同类型实体之间的多对多关系

标签 c# asp.net-mvc-3 entity-framework ef-code-first entity-framework-migrations

我有一个 ASP.NET MVC3 应用程序,我在其中使用 Entity Framework 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; }
}

当我搭建添加的 Follows 属性时,我得到了这样的迁移:

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

    ...
}

因此 Entity Framework 将我的模型解释为两个用户之间的一对一关系。

如何在相同类型的实体之间创建多对多关系?

最佳答案

因为这是一个多对多的自连接关系,用户实体应该有一个 FollowersFollowing 属性,它们都是 User 类型。所以让我们改变你的类(class)以包括那些

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 我们需要在这两者之间建立多对多关系。因此,让我们通过覆盖 OnModelCreating 方法来使用 Fluent API 来做到这一点

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

现在 Entity Framework 将像这样创建表。

enter image description here

请注意,我们明确告诉 Entity Framework 使用 UserIdFollowerId 作为外键列名称。如果我们没有提到这一点,EF 将使用 User_IDUser_ID1 作为列名。

关于c# - MVC3中相同类型实体之间的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10421351/

相关文章:

c# - 在 C# 中设置和获取网络浏览器中的输入值

c# - 为什么要覆盖字符串的开头而不是粘贴到结尾?

jquery - Facebook 评论插件

c# - 使用 Entity Framework 从 Excel 工作表中读取数据

c# - 使用 NUnit 和 NSubstitute 对通用存储库进行单元测试

c# - 从未插入的字典键中的空值

C#:限制字符串的长度?

c# - 在代码优先 Entity Framework 中处理每个用户具有不同值的属性

asp.net-mvc-3 - 如果填充了另一个字段,则 MVC 3 字段为必填字段

asp.net-mvc-3 - 如何将模型传递给 MVC 3 Razor "masterpage"