2012-01-20 56 views
0

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

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

在完全不相关的注释,数据库表中的单数形式,而不是多个通常称为(即'User'和'Role'而非'Users'和'Roles')。 –

+0

@DJKRAZE:不,这只是一个数据库设计习惯用法;它与EF没有任何关系(因此我为什么说它完全不相关)。 –

回答

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

你的第一个映射告诉你有Role无外露导航属性一个多一对多的关系EF。因此EF假定Role.Users属于另一个 - 默认一个一对多 - UserRole其具有User的端部之间的关系,也不会在模型被暴露。您看到的FK列属于第二个关联。

相关问题