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

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

接下来看如下代码清单:

首先看我们的User、Role实体

 public class User

 {

     public User() {}

     public int UserId { get; set; }

     public string Name { get; set; }

     public string Password { get; set; }

     public string PasswordSalt { get; set; }

     public Byte Status { get; set; }

     public DateTime CreatedDate { get; set; }

     public DateTime ModifiedDate { get; set; }

 }

 public class Role

 {

      public Role() {}

      public int RoleId { get; set; }

      public string RoleName { get; set; }

 }

接下来,我们知道用户包含多个角色,那么在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_UserId、Role_RoleId,但实际工作中我们可能不会这样定义或者希望可以更多定制化,接下来我们通过Fluent API(注:我这里直译为流畅的API声明,大家可以看字面意思理解,我不一定对)方式来进行数据声明,我们这里关系是一个用户可以包含多个角色,一个角色也可以包含多个用户,那我们在DataContext的OnModelCreating重载方法里这样写:

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

Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)的更多相关文章

  1. Entity Framework入门教程:什么是Entity Framework

    Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. ...

  2. [转]Entity Framework Fluent API - Configuring and Mapping Properties and Types

    本文转自:https://msdn.microsoft.com/en-us/data/jj591617#1.2 When working with Entity Framework Code Firs ...

  3. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  4. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  5. [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例

    本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...

  6. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  7. Entity Framework Code First关系映射约定【l转发】

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  8. EF(Entity Framework)多对多关系下用LINQ实现"NOT IN"查询

    这是今天在实际开发中遇到的一个问题,需求是查询未分类的博文列表(未加入任何分类的博文),之前是通过存储过程实现的,今天用EF实现了,在这篇博文中记录一下. 博文的实体类BlogPost是这样定义的: ...

  9. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)

    在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...

随机推荐

  1. 与HDFS交互-By shell命令

    Shell命令的开头有三种: hadoop fs hadoop dfs hdfs dfs 关于具体命令之前写过 可查看:https://www.cnblogs.com/floakss/p/970344 ...

  2. the ssl module in Python is not available错误解决

    在使用pip安装pymongo的过程中报错,提示如下: $ pip3 install pymongo pip is configured with locations that require TLS ...

  3. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

  4. shell脚本学习一

    shell脚本是一种程序与linux内核的语言: 第一个shell脚本: #!/bin/bash echo "cxy" 就是输出cxy 如何执行这个脚本呢: cd demo 进入s ...

  5. JiJiDown

    发生了预料之外的错误:System.Reflection.TargetInvocationException: Exception has been thrown by the target of a ...

  6. Luogu P1608 路径统计 最短路计数

    颓了...重边导致我乖乖用邻接矩阵.... 好吧就是个最短路计数....如果更新时d[v]==d[u]+w[i],就可以接起来,把两个加在一起.. 如果d[v]>d[u]+w[i],那么c[v] ...

  7. echarts图调用多个接口

    html: <div id="sentimentMain1" style="width:960px;height:500px;margin:20px auto;&q ...

  8. day_06 再谈编码

    1. 小数据池(常量池) 1.id() 通过id()查询一个变量在内存中的地址 2.is和== 1.is 判断左右两端内存地址是否一致,如果返回值是TRUE,则可以判断这两个变量值是同一对象 2.== ...

  9. Java StringTokenzier

    Java中substring方法可以分解字符串,返回的是原字符串的一个子字符串.如果要讲一个字符串分解为一个一个的单词或者标记,StringTokenizer可以帮你. public static v ...

  10. mysql初始化

    注意:--install前,必须用mysql启动命令的绝对路径 # 制作MySQL的Windows服务,在终端执行此命令: mysqld --install # 移除MySQL的Windows服务,在 ...