我有以下实体:
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这样做以及如何解决它 - 最好删除不必要的列?
答案 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
属于另一个 - 默认是一对多 - User
和Role
之间的关系,其结尾为User
,也未公开该模型。您看到的FK列属于第二个关联。