zoukankan      html  css  js  c++  java
  • Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)

        通常我们在做数据库设计时都会有两张表是多对多关系的时候,在数据库做多对多关系时候我们通常通过中间关联表来处理,那我们现在在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)
    
        {        
    
        }
    
    }
    

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

    可以看到我们中间的链接表生成的是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

  • 相关阅读:
    Eclipse consle 输出语句中,误输中文,假死问题
    Eclipse 快捷键 (最实用)
    mysql 4种启动方式
    mysql索引的类型和优缺点
    Windows上 使用Composer安装tp5
    php 更新配置文件
    可视化工具连接Linux上的redis
    HttpClient 4 教程 第3章 HTTP状态管理
    HttpClient 4 教程 第2章 连接管理
    HttpClient 4 教程 第1章 基础
  • 原文地址:https://www.cnblogs.com/bestfriends/p/6721865.html
Copyright © 2011-2022 走看看