Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)
通常我们在做数据库设计时都会有两张表是多对多关系的时候,在数据库做多对多关系时候我们通常通过中间关联表来处理,那我们现在在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多对多关系映射)的更多相关文章
- Entity Framework入门教程:什么是Entity Framework
Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. ...
- [转]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 ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- Entity Framework Code First关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...
- Entity Framework Code First主外键关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Entity Framework Code First关系映射约定【l转发】
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- EF(Entity Framework)多对多关系下用LINQ实现"NOT IN"查询
这是今天在实际开发中遇到的一个问题,需求是查询未分类的博文列表(未加入任何分类的博文),之前是通过存储过程实现的,今天用EF实现了,在这篇博文中记录一下. 博文的实体类BlogPost是这样定义的: ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)
在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...
随机推荐
- 基于注解的AOP配置
配置文件 spring配置文件中的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...
- CSS选择器及CSS样式表
前言 牛腩新闻发布系统中记忆最深的就是各种CSS选择器各种CSS样式,这些选择器之间肯定有它的优先级,包括CSS样式也一样,也是有它的优先级,本文介绍一些各种CSS选择器各种CSS样式以及它们的优先级 ...
- MongoDB3.2(C#版) CRUD
Retrieve(检索.查询): 分两种(一种是插入对象没有自定义; 第二种就是自定义插入对象) 这两种情况下的区别就是插入数据库中的文档类型不一样,一个是BsonDocument,一个是自定义对象( ...
- 阿里云linux安装jmeter并进行压测
一.阿里云linux安装JDK 1.下载安装JDK jdk官网,选择linux版本,下载并保存. (一)yum安装 安装epel的yumyuan yum install epel-release -y ...
- 常用linux基础命令(持续更新...)
删除 空目录 rmdir非空目录 rm -rf 目录名字-r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思 删除文件命令rm -f 文件名将会强行删除文件,且无提 ...
- java Pattern和Matcher完全解析
基本使用: 本文不讲解正则表达式,需要请看API Scanner中的使用正则表达式 //Scanner 支持的分组 Scanner cin=new Scanner("red a bbc&qu ...
- Django 11 form表单(状态保持session、form表单及注册实现)
Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...
- python 批量下载 spring 的 xsd
#coding=utf-8 import os import urllib import urllib2 import re from bs4 import BeautifulSoup # 利用 ur ...
- Kibana6.x.x——源码发布
从官方GitHub上克隆下来的源码自己如何发布? 我在Ubuntu系统中进行的开发,安装了yarn. 执行build命令为:$ yarn build 执行release命令为:$ yarn relea ...
- CodeForces - 124B-Permutations(DFS)
You are given n k-digit integers. You have to rearrange the digits in the integers so that the diffe ...