EF normally creates the intermediate model, if the UserRole table comprises of columns other than foreign keys for User and Role table.
So if you had just 2 columns in the UserRoles table, both FKs to the User and Role tables (not even a surrogate key), EF would create the Model as you wanted. (without any intermediate model) So that is one way to go, for automatic generation of the desired behavior. Have just 2 columns in the table.
But if you have other non-key columns (data) in this table, then what EF is doing is correct. You need the intermediate entity.
And in the case where you don't have any non-key columns, don't want to modify your DB anymore and don't need this middle table in your model, you could manually modify the OnModelCreating, to specify the Many-to-Many and hide the intermediate table.
Here are all the steps:
- Remove the intermediate table definition C# class from the model layer, and its references in DbContext and User and Role classes.
- Add a virtual Collection property in both User and Role class, for each other.
e.g. in the User class,
public virtual ICollection<Role> Roles { get; set; }
and in the User constructor
this.Roles = new HashSet<Role>();
// on the OnModelCreating method, add this snippet
modelBuilder.Entity<User>().HasMany<Role>(u => u.Roles)
.WithMany(r => r.Users)
.Map(ru =>
{
ru.MapLeftKey("UserId");
ru.MapRightKey("RoleId");
ru.ToTable("UserRole");
});
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…