ASP.NET EntityFrameworkCore code first 多对多设计
参考网址:https://docs.microsoft.com/zh-cn/ef/core/get-started/full-dotnet/new-db
场景:使用ASP.NET EntityFrameworkCore CODE FIRST 创建多对多实体
需求:CODE FIRST实现多对多的实体创建。
细节:
创建两个实体类,一个是AppUser,一个是AppRole,两个实体通过UserRole关联。即一个AppUser可能隶属于多个AppRole,一个AppRole可能关联了多个AppUser。
在EntityFrameworkCore 中,不支持两个实体之间的直接多对多,可以通过引入第三个实体,分别进行两次一对多来间接实现多对多。
官方描述为:
Many-to-many relationships without an entity class to represent the join table are not yet supported. However, you can represent a many-to-many relationship by including an entity class for the join table and mapping two separate one-to-many relationships.
步骤:
1.使用VS2017创建项目;
2.NuGet添加 Microsoft.EntityFrameworkCore.SqlServer
3.创建如下三个类
public class AppUser
{ public int AppUserID { get; set; }
public string Guid { get; set; } public string UserName { get; set; }
public string LoginName { get; set; }
public string LoginPassword { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public int Sex { get; set; } public int BranchOfficeID { get; set; }
public BranchOffice BranchOffice { get; set; } public List<UserRole> UserRoles { get; set; } }
logs_code_collapse">AppUser 类
public class AppRole
{
public int AppRoleID { get; set; }
public string Guid { get; set; }
public string RoleName { get; set; } public List<UserRole> UserRoles { get; set; }
}
AppRole类
public class UserRole
{
public int UserRoleID { get; set; } public int AppRoleID { get; set; }
public AppRole AppRole { get; set; } public int AppUserID { get; set; }
public AppUser AppUser { get; set; }
}
UserRole类
4.创建DBContext
public class ApiContext:DbContext
{ public DbSet<AppUser> AppUsers { get; set; } public DbSet<AppRole> AppRoles { get; set; } public DbSet<UserRole> UserRoles { get; set; } /// <summary>
/// 通过第三张表UserRole 实现 多对多绑定 AppRole 和 AppUser
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserRole>()
.HasKey(t => new { t.AppRoleID, t.AppUserID }); modelBuilder.Entity<UserRole>()
.HasOne(userrole => userrole.AppUser)
.WithMany(user => user.UserRoles)
.HasForeignKey(userrole => userrole.AppUserID); modelBuilder.Entity<UserRole>()
.HasOne(userrole => userrole.AppRole)
.WithMany(role => role.UserRoles)
.HasForeignKey(userrole=> userrole.AppRoleID);
} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=sandbox.XXXX.com;Initial Catalog=API;Persist Security Info=True;User ID=sa;Password=XXXXX;");
}
}
DbContext类
5.运行 Add-Migration APIMigration
运行结束后,可以发现项目中多了 APIMigration.cs

6.运行Update-Database,生成数据库。
检查数据库生成结果:

检查UserRoles表的外键:

至此,创建多对多的实体成功。
ASP.NET EntityFrameworkCore code first 多对多设计的更多相关文章
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- Entity Framework 实体框架的形成之旅--Code First的框架设计(5)
在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好, ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- Windows下构建ASP.NET Core+Code First+Docker
背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...
- [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...
- ASP.net MVC5 Code First填充测试数据到数据库
问题的产生 最近在看Adam Freeman的“Pro ASP.NET MVC5”,于是在工作机上面搭建了相应的运行环境,但是在自己的机器上面只有代码,没有数据库.记得在code first中可以新 ...
- EntityFrameWork Code First 多对多关系处理
场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别 Article和Category的代码更改如下: /// <summary> /// ...
- ASP.NET MVC 3:缓存功能的设计问题
今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...
随机推荐
- 【原理】Java的ThreadLocal实现原理浅读
当前线程的值传递,ThreadLocal 通过ThreadLocal设值,在线程内可获取,即时获取值时在其它Class或其它Method. public class BasicUsage { priv ...
- ZooKeeper学习之文件系统的布局和格式
本文来谈谈快照文件,事务日志文件在文件系统中是如何存放的. 写事务日志是事务处理的关键步骤,所以高度建议在一个独立的磁盘上存储.快照不需要在独立的磁盘存储,因为它们是由一个后台线程以懒汉式的(lazi ...
- 【Delphi】@,^,#,$特殊符号意义
概述 ^: 指针 @: 取址 #: 十进制符 $: 十六进制符 @ :取址运算符 var int :integer; p :^integer; begin new(P); int :=; p := ...
- mysql查询字段为null 返回0
SELECT IF(AVG(字段) IS NULL,0, 字段) as 重命名 From xxx
- Android开发(一)——全屏或者取消标题栏
先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 注意这句一定要写在se ...
- 修改urllib2源代码,定制User-Agent,一劳永逸
我经常用到urllib2这个库,基本上每次都要添加 User-Agent 为一个模拟浏览器的值. 突然想到,能不能直接修改源代码,添加 User-Agent 的值. google 到 https:// ...
- Android实例-获取屏幕的物理分辨率
相关资料: http://blog.qdac.cc/?p=1161 实例代码: unit Unit1; interface uses System.SysUtils, System.Types, Sy ...
- CTF中常见Web源码泄露总结
目录00x1 .ng源码泄露 00x2 git源码泄露 00x3 .DS_Store文件泄漏 00x4 网站备份压缩文件 00x5 SVN导致文件泄露 00x6 WEB-INF/web.xml泄露 ...
- Android 后台发送邮件 (收集应用异常信息+Demo代码)
上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序.上次说的收集方法主要是把收集的信息通过Http的post请求把相关的异常信息变成请求参数发送到服务器.这个对做过web开发的人 ...
- android开发(33) 让 actionbar 透明2
让 actionbar 的背景 透明 我需要一个 透明的actionbar ,找到如下方法实现: 1. 首先,设置ActionBar 浮动到主界面上来. 2. 然后,设置ActionBar的背景色,透 ...