2012-01-20 51 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列屬於第二個關聯。

相關問題