Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)

时间:2022-10-05 17:18:20

    通常我们在做数据库设计时都会有两张表是多对多关系的时候,在数据库做多对多关系时候我们通常通过中间关联表来处理,那我们现在在EF中是如何处理的呢?

    假设我们有如下关系,用户(User)包含多个角色(Role),角色包含多个用户的情况下,我们如何用EF来处理这样的数据库设计呢?

接下来看如下代码清单:

首先看我们的UserRole实体

 1 public class User
 2 
 3 {
 4 
 5     public User() {}
 6 
 7  
 8 
 9     public int UserId { get; set; }
10 
11     public string Name { get; set; }
12 
13     public string Password { get; set; }
14 
15     public string PasswordSalt { get; set; }
16 
17     public Byte Status { get; set; }
18 
19     public DateTime CreatedDate { get; set; }
20 
21     public DateTime ModifiedDate { get; set; }
22 
23 }
24 
25 public class Role
26 
27 {
28 
29      public Role() {}
30 
31      public int RoleId { get; set; }
32 
33      public string RoleName { get; set; }
34 
35 }

接下来,我们知道用户包含多个角色,那么在User实体中添加这样的代码

public virtual ICollection<Role> Roles { get; set; }

 

User的构造函数中添加这样代码

this.Roles = new HashSet<Role>();

 

同样的,角色也包含多个用户,那么在Role实体中添加这样代码

public virtual ICollection<User> Users { get; set; }

 

Role构造函数中添加这样代码

this.Users = new HashSet<User>();

 

接下来,构造我们继承自DbContext类的DataContext

public class DataContext : DbContext

{

    public DataContext()

        : base("DataContext")

    {

    }

    public DbSet<User> Users { get; set; }

    public DbSet<Role> Roles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)

    {        

    }

}

 

接着,我们生成我们项目,就可以看到我们生成的数据库关系了

Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)

可以看到我们中间的链接表生成的是User_UserIdRole_RoleId,但实际工作中我们可能不会这样定义或者希望可以更多定制化,接下来我们通过Fluent API(注:我这里直译为流畅的API声明,大家可以看字面意思理解,我不一定对)方式来进行数据声明,我们这里关系是一个用户可以包含多个角色,一个角色也可以包含多个用户,那我们在DataContextOnModelCreating重载方法里这样写:

modelBuilder.Entity<User>()

    .HasMany(r => r.Roles)

.WithMany(u => u.Users);

 

进一步我们指定中间链接表

 modelBuilder.Entity<User>()

     .HasMany(r => r.Roles)

     .WithMany(u => u.Users)

     .Map(ur =>

     {

         ur.MapLeftKey("UserId");

         ur.MapRightKey("RoleId");

         ur.ToTable("UserRoles");

     });

 

参考资料:

http://www.cnblogs.com/panchunting/p/entity-framework-code-first-fluent-api-configuring-relationships.html