​ 在EF6.0 中,多对多关系配置时,系统会自动生成第三张表,来将两张有互相约束关系的表联系起来,但是在EF Core2.0中,我们需要手动建立第三张表,比如说有两个模型Passage.cs和Category.cs,若想建立两者之间的多对多关系,我们就需要借助第三张表PassageCategory来实现:

public class Passage
{
//文章编号
[Key]
public long PassageId { get; set; } //标题
public string Title { get; set; } //描述
public string Description { get; set; } //内容
public string Content { get; set; } //发布时间
public DateTime PublishTime { get; set; } //最后编辑时间
public DateTime LastEditTime { get; set; } //文章分类(使用技术等)
public virtual IList<PassageCategory> PassageCategories { get; set; }
}
public class Category
{
[Key]
public int CategoryId { get; set; } [MaxLength(50)]
public string CategoryName { get; set; } public virtual IList<PassageCategory> PassageCategories { get; set; }
}

public class PassageCategory
{
public int CategoryId { get; set; } public Category Category { get; set; } public long PassageId { get; set; } public Passage Passage { get; set; }
}

然后添加 FluentAPI 配置,在配置多对多关系时,必须指定级联删除。

​ 先说一下EFCore的几种级联模式:

  • Cascade

    ​ 依赖的实体也一并被删除。这种级联行为只对被上下文跟踪到的实体有效。数据库里也需要设置相应的级联,确保没有被上下文跟踪到的数据也具备同样的行为。如果你通过EF来创建数据库,那么EF会为你设置好数据库的级联。

  • Restrict

    ​ 删除操作不会作用在依赖实体上,依赖实体保持不变。

  • SetNull

    ​ 依赖实体的外键被设为null。这种级联行为只对被上下文跟踪到的实体有效。数据库里也需要设置相应的级联,确保没有被上下文跟踪到的数据也具备同样的行为。如果你通过EF来创建数据库,那么EF会为你设置好数据库的级联。

  • ClientSetNull

    ​ EFCore2.0引入了一种叫作ClientSetNull的默认行为。它具有SetNull的语义,兼有Restrict的行为。从我们的经验来看,对于被跟踪的实体和数据库来说,它是最被期待也是最有用的一种行为。

​ 在为被跟踪的实体设置级联关系时,DeleteBehavior.Restrict已经成为历史。

​ 添加一个新类 PassageCategoryMap.cs 该类继承自 IEntityTypeConfiguration 接口

    public class PassageCategoryMap : IEntityTypeConfiguration<PassageCategory>
{
/// <summary>
/// PassageCategories FluentAPI配置
///
/// 添加复合主键、配置多对多关系
/// </summary>
/// <param name="builder"></param>
public void Configure(EntityTypeBuilder<PassageCategory> builder)
{
//添加复合主键
builder.HasKey(t => new { t.PassageId, t.CategoryId }); ///<summary>
///
/// 配置Passage与PassageCategories的一对多关系
///
/// EFCore中,新增默认级联模式为ClientSetNull
///
/// 依赖实体的外键会被设置为空,同时删除操作不会作用到依赖的实体上,依赖实体保持不变,同下
///
/// </summary> //配置Passage与PassageCategories的一对多关系
builder.HasOne(t => t.Passage).WithMany(p => p.PassageCategories).HasForeignKey(t => t.PassageId).OnDelete(DeleteBehavior.SetNull); //配置Category与PassageCategories的一对多关系
builder.HasOne(t => t.Category).WithMany(p => p.PassageCategories).HasForeignKey(t => t.CategoryId).OnDelete(DeleteBehavior.SetNull);
}
}

​ 然后在 DbContext 类中,重写 OnModelCreating 方法添加 FluentAPI 配置

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder); //查找所有FluentAPI配置
var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null); //应用FluentAPI
foreach(var type in typesToRegister)
{
//dynamic使C#具有弱语言的特性,在编译时不对类型进行检查 dynamic configurationInstance = Activator.CreateInstance(type);
builder.ApplyConfiguration(configurationInstance);
}
}

​ 然后添加数据迁移,更新数据库,就完成了多对多关系数据库的配置。

EntityFramework Core2.0 多对多关系配置的更多相关文章

  1. hibernate多对多关系配置

    一.创建用户,角色实体类. 一名用户可以有多个角色.一个角色可以对于多名用户. 用户实体类 public class User { private int uId; private String uN ...

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

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

  3. Hibernate 关系配置

    表之间关系 1. 一对多 一个部门有多个员工,一个员工只能属于某一个部门 一个班级有多个学生,一个学生只能属于一个班级 2. 多对多 一个老师教多个学生,一个学生可以被多个老师教 一个学生可以先择多门 ...

  4. EF Core反向导航属性解决多对一关系

    多对一是一种很常见的关系,例如:一个班级有一个学生集合属性,同时,班级有班长.语文课代表.数学课代表等单个学生属性,如果定义2个实体类,班级SchoolClass和学生Student,那么,班级Sch ...

  5. MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载

    一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...

  6. EF里一对一、一对多、多对多关系的配置和级联删除

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  7. 多对多关系<EntityFramework6.0>

    无负载建立多对多关联的模型 原文中是Modeling a Many-to-Many Relationship with No Payload,虽然这么翻译也有点不准确,但是可以说明其目的,如下图所示, ...

  8. EF——一对一、一对多、多对多关系的配置和级联删除 04(转)

    EF里一对一.一对多.多对多关系的配置和级联删除   本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...

  9. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

随机推荐

  1. Java 并行编程!

    多核处理器现在已广泛应用于服务器.台式机和便携机硬件.它们还扩展到到更小的设备,如智能电话和平板电脑.由于进程的线程可以在多个内核上并行执行,因此多核处理器为并发编程打开了一扇扇新的大门.为实现应用程 ...

  2. Visual Studio最常用的快捷键

    Ctrl + J:快捷提示,强迫智能感知: Ctrl + 空格键:使用 IntelliSense(智能感知)自动完成: Ctrl + Z:撤销,回退键: Ctrl + Shift + 空格:强迫显示参 ...

  3. postgresql 匿名函数(单独执行代码段)

    do LANGUAGE plpgsql $$ declare top integer; row_org dbo.a_org_type%rowtype; begin /* Insert real cod ...

  4. js 中使用 #region #endregion

    vs 和 vs code 都是可以支持 js 使用 #region 折叠代码的:code 我就不说了 同理vs 的: 首先下载 vs 插件,插件路径:https://archive.codeplex. ...

  5. ASP.NET MVC 简单事务添加

    ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...

  6. vue项目中引入bootstrap

    (1)引入Jquery文件,需要在bootstrap.min.js 之前引入. 1.npm install jquery --save-dev 2. plugins: [ new webpack.Pr ...

  7. 润乾报表JSF FORM 标签中使用填报表解决方案

     需求 润乾报表的标签需要在jsf页面中和其他填报控件一起使用,润乾报表负责展现录入部分数据,并且这部分数据和页面的其它控件的数据存在前台和后台的交互. 问题 润乾报表在前台会生成自己的form, ...

  8. oracle 用户系统权限

    conn sys as sysdba; create user test identified by test; grant create session to test; grant create ...

  9. shrio的简单认识

    博客讲解; shrio的知识储备 shrio的简单认识 笔记整理地址: Shrio.pdf 下载 Shrio理论.doc   下载 shrio知识储备.doc  下载

  10. Java 性能调优指南之 Java 集合概览

    [编者按]本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文: 本 ...