Entity Framework Database First many-to-many

前端 未结 1 1803
陌清茗
陌清茗 2020-12-06 13:10

I\'ve created an Entity Framework model from the database. I have many-to-many relationship: User - UserRole - Role.

EF creat

1条回答
  •  -上瘾入骨i
    2020-12-06 13:44

    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:

    1. Remove the intermediate table definition C# class from the model layer, and its references in DbContext and User and Role classes.
    2. Add a virtual Collection property in both User and Role class, for each other.

    e.g. in the User class,

    public virtual ICollection Roles { get; set; }
    

    and in the User constructor

    this.Roles = new HashSet();
    
    // on the OnModelCreating method, add this snippet
    modelBuilder.Entity().HasMany(u => u.Roles)
                              .WithMany(r => r.Users)
                              .Map(ru => 
                                       {  
                                         ru.MapLeftKey("UserId");        
                                         ru.MapRightKey("RoleId"); 
                                         ru.ToTable("UserRole"); 
                                       });
    

    0 讨论(0)
提交回复
热议问题