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项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...
随机推荐
- Scroll的使用
1.给父元素限制宽高 2.给Scroll限制高度,并overflow:hidden; <div class="rank"> <scroll class=" ...
- Linux下golang开发环境搭建
对于golang开发来说,Windows下可以用vscode或者liteide都不错,但是Linux下的开发也就只有vim了,所以怎么搞笑的利用vim进行golang开发呢? 参考官方推荐的一个插件: ...
- Using curl to upload POST data with files
https://stackoverflow.com/questions/12667797/using-curl-to-upload-post-data-with-files ************* ...
- Java Web项目部署时 “Exploded Archive”模式部署时无效
在myeclipse中部署项目时,当Deploy type为Exploded Archive(deveplopment mode)时,finish按钮为灰色,无法部署的解决方法: 1.project上 ...
- red hat enterprise linux 6
i386(32位):http://rhel.ieesee.net/uingei/rhel-server-6.3-i386-dvd.iso迅雷快传:http://kuai.xunlei.com/d/PF ...
- ubuntu 12.04下编译安装nginx-1.9.3
1,下载nginx-1.9.3.tar.gz 两种方式: (1).ubuntu 下终端中(ctrl+alt+t) 运行命令: wget http://nginx.org/download/nginx- ...
- C语言 · 数组输出
算法提高 数组输出 时间限制:1.0s 内存限制:512.0MB 输入一个3行4列的数组,找出该数组中绝对值最大的元素.输出该元素及其两个下标值.如有多个输出行号最小的,还有多个的话 ...
- ubuntu 14.04 gitlab 的搭建
经过两天的尝试,gitlab 终于在 ubuntu14.04 上面搭建起来. 一.安装相关软件. // 执行如下命令: sudo apt-get install vim git curl openss ...
- [deb]制作deb包
转自:http://www.cnblogs.com/Genesis-007/p/5219960.html 查看系统安装了哪些deb包: dpkg -l 打包: dpkg -b dir result.d ...
- Android——Service装取数据
在Service里面装数据,从Activity里面用serviceConnection取数据 xml <?xml version="1.0" encoding="u ...