EF Core – Many to Many
前言
Many to many 是 EF Core 5.0 才开始有的, 以前都用 2 个 1-n 来实现的.
由于它比 1-n 复杂, 所以有必要写一遍来记入一下.
参考:
Without Fluent API
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; } public ICollection<Tag> Tags { get; set; }
} public class Tag
{
public string TagId { get; set; } public ICollection<Post> Posts { get; set; }
}
在完全没有 Fluent API 配置下, 只要 2 个 class 有关系的 collection 就可以表达 n-n 了.

它会自动创建一个 Join entity type configuration, 就可以生产 migration 了.
为什么是 CategoryProduct 而不是 ProductCategory 呢?
它是按 class name A-Z 排序的. C 比 P 前面, 所以就是 CategoryProduct.
Joining relationships configuration (Dictionary)
想自己配置 Join entity type configuration 也是 ok 的.
modelBuilder.Entity<Category>()
.HasMany(e => e.Products)
.WithMany(e => e.Categories)
.UsingEntity<Dictionary<string, object>>(
j => j
.HasOne<Product>()
.WithMany()
.HasForeignKey("ProductId")
.OnDelete(DeleteBehavior.Cascade),
j => j
.HasOne<Category>()
.WithMany()
.HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade),
j =>
{
j.ToTable("CategoryProduct");
j.Property<int>("Id").HasColumnName("CategoryProductId");
j.HasKey("Id").IsClustered(false);
j.HasIndex("ProductId", "CategoryId").IsUnique().IsClustered(true); j.HasAnnotation("AuditTrail", null);
j.Property<string>("CreatedBy");
j.Property<DateTimeOffset>("DateCreated");
}
);
第 3 个 parameter 是配置 Join Entity. 注意这里用的是 Dictionary 来表示 Join Entity 而不是 class, 这个做法比较适合那种在 application level 不会用到这个 join entity 的情况.
如果需要用到的话, 那么应该用下面这个方式.
Joining relationships configuration (Class)
public class CategoryProduct
{
public int Id { get; set; }
public int ProductId { get; set; }
public Product Product { get; set; } = null!;
public int CategoryId { get; set; }
public Category Category { get; set; } = null!;
public string CreatedBy { get; set; } = "";
public DateTimeOffset DateCreated { get; set; }
}
没有太大的区别, 就是定义多一个 class 就 ok 了.
modelBuilder.Entity<Category>()
.HasMany(e => e.Products)
.WithMany(e => e.Categories)
.UsingEntity<CategoryProduct>(
j => j.HasOne(e => e.Product)
.WithMany()
.HasForeignKey(e => e.ProductId)
.OnDelete(DeleteBehavior.Cascade),
j => j.HasOne(e => e.Category)
.WithMany()
.HasForeignKey(e => e.CategoryId)
.OnDelete(DeleteBehavior.Cascade),
j =>
{
j.ToTable("CategoryProduct");
j.HasKey(e => e.Id).IsClustered(false);
j.HasIndex(e => new { e.CategoryId, e.ProductId }).IsUnique().IsClustered(true);
}
);
EF Core – Many to Many的更多相关文章
- EF Core 数据库迁移(Migration)
工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用 Pomelo.EntityFrameworkCore.MySql 源代码地址(https://github. ...
- Asp.net Core 通过 Ef Core 访问、管理Mysql
本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环 ...
- EF Core 杂记
本系列文章,将介绍本人在学习和使用EF Core的过程中的收获与心得. 或许有的地方讲的错误 欢迎大家批评指出. 1.EF Core 数据库迁移(Migration)
- MySQL官方.NET Core驱动已出,支持EF Core
千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...
- EF Core 1.0 和 SQLServer 2008 分页的问题
EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...
- EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...
- EF Core CodeFirst实践 ( 使用MS SqlServer)
这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择 ASP.NET Core Web Application (.NET Core) ...
- ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First
ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...
- ASP.NET Core 开发 - Entity Framework (EF) Core
EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...
- 再谈EF Core内存数据库单元测试问题
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在用EF Core的内存数据库进行单元测试的时候遇到"无法访问已释放的对象& ...
随机推荐
- PAT-1003 我要通过! (20分) JavaScript(node)
"答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&q ...
- oeasy教您玩转vim - 12 - # 词头词尾
词头词尾 回忆上节课内容 我们这次学了向前一个单词 w 意思是 word 还学习了向后一个单词 b 意思是 backward 这俩命令都落在单词的第一个字母 还有什么好玩的命令吗? 动手练习 我们可以 ...
- 从DDPM到DDIM (一) 极大似然估计与证据下界
从DDPM到DDIM (一) 极大似然估计与证据下界 现在网络上关于DDPM和DDIM的讲解有很多,但无论什么样的讲解,都不如自己推到一遍来的痛快.笔者希望就这篇文章,从头到尾对扩散模型做一次完整 ...
- android实现多线程基础
//创建线程类 class Mythread extends Thread{ @Override public void run(){ //定义行为 } } //实例化线程类 MyThread mt= ...
- 使用ventoy安装windows10
使用ventoy安装windows10 在ventoy中选择windows10镜像 进入Windows安装界面 下一步,选择现在安装 稍等片刻 选择我没有产品密钥 根据需求选择对应版本 下一步,接受许 ...
- Python获取指定网段正在使用的IP
Python获取指定网段正在使用的IP #!/usr/bin/env python # -*- coding: utf-8 -*- ''''' 使用方法样例 python test20.py 192. ...
- 【BlueTooth】 小米手机蓝牙传输文件
打开小米手机的蓝牙设置,寻找电脑设备(电脑装有蓝牙设备) 同时电脑也打开蓝牙面板,两个设备都开始进行匹配: 然后电脑打开蓝牙的[接收传输文件] 手机打开图库或者文件管理,找到文件发送时选择[蓝牙] 传 ...
- 【Mycat】01 概述
什么是Mycat? 数据库中间件 中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通. 例子:Tomcat,web中间件. 数据库中间件:连接java应用程序和数据库 为什么要用 ...
- 【FastDFS】环境搭建 02 测试
自带工具测试: 编辑客户端配置文件: vim client.conf 配置完成后,随便上传一个图片到root目录下 运行FastFDS文件上传程序,并将客户端配置文件作为加载参数1,要上传的图片文件位 ...
- 【转载】 Python Pillow 和 cv2 图片 resize 速度的比较
原文地址: https://zhuanlan.zhihu.com/p/91078855 -------------------------------------------------------- ...