EntityFramework Core2.0 多对多关系配置
在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 多对多关系配置的更多相关文章
- hibernate多对多关系配置
一.创建用户,角色实体类. 一名用户可以有多个角色.一个角色可以对于多名用户. 用户实体类 public class User { private int uId; private String uN ...
- EntityFrameWork Code First 多对多关系处理
场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别 Article和Category的代码更改如下: /// <summary> /// ...
- Hibernate 关系配置
表之间关系 1. 一对多 一个部门有多个员工,一个员工只能属于某一个部门 一个班级有多个学生,一个学生只能属于一个班级 2. 多对多 一个老师教多个学生,一个学生可以被多个老师教 一个学生可以先择多门 ...
- EF Core反向导航属性解决多对一关系
多对一是一种很常见的关系,例如:一个班级有一个学生集合属性,同时,班级有班长.语文课代表.数学课代表等单个学生属性,如果定义2个实体类,班级SchoolClass和学生Student,那么,班级Sch ...
- MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载
一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...
- EF里一对一、一对多、多对多关系的配置和级联删除
本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...
- 多对多关系<EntityFramework6.0>
无负载建立多对多关联的模型 原文中是Modeling a Many-to-Many Relationship with No Payload,虽然这么翻译也有点不准确,但是可以说明其目的,如下图所示, ...
- EF——一对一、一对多、多对多关系的配置和级联删除 04(转)
EF里一对一.一对多.多对多关系的配置和级联删除 本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...
随机推荐
- 记录自己使用到的git命令行代码与git使用流程
1.安装创建版本库 新建一个文件夹,用命令行实现: $ cd /d //进入d盘 $ mkdir gitproject //新建gitproject文件夹 $ cd ...
- 手机浏览器_安卓_苹果手机Webview 中唤醒APP
Url scheme是iOS,Android平台都支持,只需要原生APP开发时注册scheme, 那么用户点击到此类链接时,会自动跳到APP.比如 <!-- 打开考拉APP首页 --> & ...
- Feign性能优化注意事项--超时
Caused by: java.lang.IllegalStateException: PathVariable annotation was empty on param 1. at feign ...
- Json递归解析实例
最近遇到包含多层的Json字符串解析的问题,查了一些帖子,不能很好解决.看了下帮助文档,用下面方法解决. 上代码 Maven 库 <!-- https://mvnrepository.com/a ...
- Windows2012开机启动项设置
最简单方式 开始->运行->输入shell:startup 在打开的启动文件夹中,将需要启动程序的快捷方式复制进去,完工 重启试试吧 https://blog.csdn.net/tmton ...
- automapper 自动映射 集成asp.net Core2.1
学习博文:https://www.cnblogs.com/yan7/p/8085410.html 1.使用nuget 安装 <PackageReference Include="Aut ...
- [javaSE] 数组(获取最值)
数组的常见操作(获取最值) 1.获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行存储 2.让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用 ...
- 无法正常下载Nuget 包的问题
引用Nuget 是遇到的问题,再次记录一下. 问题描述:Install-Package : 无法安装程序包“Quartz 3.0.2”.您正在尝试将此程序包安装到某个将“.NETFramework,V ...
- 浅谈JVM-图解类加载机制
一.目录 二.类加载机制流程 1.什么是类加载机制? JVM把class文件加载到内存里面,并对数据进行校验.准备.解析和初始化,最终能够被形成被JVM可以直接使用的Java类型的过程. 2.类加载流 ...
- HDU1560(KB2-E IDA星)
DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...