为什么为参与M:M关系的实体生成额外的列?

时间:2012-01-20 20:50:15

标签: c# entity-framework-4.1 many-to-many ef-code-first

我有以下实体:

public class User
{
    public virtual ICollection<Role> Roles { get; set; }
}

public class Role
{
    public virtual ICollection<User> Users { get; set; }
}

MyContext.OnModelCreating中的以下代码:

mb.Conventions.Remove<OneToManyCascadeDeleteConvention>();
mb.Entity<T>().ToTable("Users", "myschema");
mb.Entity<T>().ToTable("Roles", "myschema");
mb.Entity<User>().HasMany(x => x.Roles).WithMany().Map(a => a.ToTable("UsersRoles", "myschema"));
mb.Entity<Role>().HasMany(x => x.Permissions).WithMany().Map(a => a.ToTable("RolesPermissions", "myschema"));

所有其他约定都是默认约定。在数据库初始化期间,用户表具有外键列 Role_Id 这没有意义用户角色 UsersRoles 表格正确无误。

使用EF时, User.Role_Id 始终 NULL ,交易成功, UsersRoles 按预期更新。如果我删除该列,EF就会抱怨它。

为什么EF这样做以及如何解决它 - 最好删除不必要的列?

1 个答案:

答案 0 :(得分:0)

这种映射是错误的:

mb.Entity<User>()
    .HasMany(x => x.Roles)
    .WithMany()
    .Map(a => a.ToTable("UsersRoles", "myschema"));

必须是:

mb.Entity<User>()
    .HasMany(x => x.Roles)
    .WithMany(x => x.Users)
    .Map(a => a.ToTable("UsersRoles", "myschema"));

您的第一个映射告诉EF您在Role中没有暴露导航属性的情况下有多对多关系。因此,EF假设Role.Users属于另一个 - 默认是一对多 - UserRole之间的关系,其结尾为User,也未公开该模型。您看到的FK列属于第二个关联。