• 摘要:参考网址:https://docs.microsoft.com/zh-cn/ef/core/get-started/full-dotnet/new-db场景:使用ASP.NETEntityFrameworkCoreCODEFIRST创建多对多实体需求:CODEFIRST实现多对多的实体创建。细节:创建两个实体类,一个是AppUser,一个是AppRole,两个实体通过UserRole关联。即一个AppUser可能隶属于多个AppRole,一个AppRole可能关联了多个AppUser
  • 标签:.net ASP.NET Framework net 设计

参考网址: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 多对多设计的更多相关文章

  1. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  2. Entity Framework 实体框架的形成之旅--Code First的框架设计(5)

    在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好, ...

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

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

  4. 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 ...

  5. Windows下构建ASP.NET Core+Code First+Docker

    背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...

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

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

  7. ASP.net MVC5 Code First填充测试数据到数据库

    问题的产生  最近在看Adam Freeman的“Pro ASP.NET MVC5”,于是在工作机上面搭建了相应的运行环境,但是在自己的机器上面只有代码,没有数据库.记得在code first中可以新 ...

  8. EntityFrameWork Code First 多对多关系处理

    场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别 Article和Category的代码更改如下: /// <summary> /// ...

  9. ASP.NET MVC 3:缓存功能的设计问题

    今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...

随机推荐

  1. 双系统linux+win之血的教训

    绝对不要用win的软件来直接调整linux分区!!!!! 除非你不想要这个linux分区里的数据了...

  2. Unity编辑器下,界面替换NGUI字体以及字号

    项目中有需要批量替换字体以及字号的需求,一般也就是多语言处理吧. 提供界面如下: 手机拍图,就这样凑合看吧.但是代码不打折. 紧急避让,我只提供修改UILabel以及UIPopupList 下的字体, ...

  3. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  4. 安装pydiction

    pydiction用来实现代码补全和语法提示功能.pydiction不能通过apt安装,需要自行下载安装. 在GitHub下载源码,可以使用Git迁出到本地,或者下载zip包自行解压,地址为:http ...

  5. 如何生动形象、切中要点地讲解 OSI 七层模型和两主机传输过程

    作者:繁星亮与鲍包包链接:https://www.zhihu.com/question/24002080/answer/31817536来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  6. iis下php 500错误

      很不想用iis,然而客户不想增加机器,只好按客户的意思了.可是没想到发送短信以在本地 机器上是好的,在iis下直接500.   一开始以为是防火墙问题,后来检查了一下没有,再后来换了一个短信接口, ...

  7. java开发之发牌小程序

    发牌规则  黑桃按照从小到大依次为:1-13 红桃按照从小到大依次为:14-26 梅花按照从小到大依次为:27-39 方块按照从小到大依次为:40-52 小王53  大王54 代码实现: packag ...

  8. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

  9. <[成长股基本面]【怎样选择成长股】>读书笔记

    书在这里 投资想赚大钱,必须有耐性 这家公司的产品或服务有没有充分的市场潜力,至少几年内营业额能否大幅成长? 为了进一步提高总体销售水平,发现新的产品增长点,管理层是不是决心继续开发新产品或新工艺? ...

  10. Shell脚本 Hello World

    #!/bin/bash echo "Hello World !" “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell.echo命令用于向窗口 ...