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的内存数据库进行单元测试的时候遇到"无法访问已释放的对象& ...
随机推荐
- 一图看懂网易数帆指标平台EasyMetrics
简化数据分析,提升决策速度!EasyMetrics,指标的全生命周期管理平台. 为何EasyMetrics? 集中化管理,降低门槛.开箱即用,提升查询速度. 适合人群? 业务用户.开发者.数据团队,E ...
- [oeasy]python049_帮助手册_pydoc_manual_document
帮助手册 回忆上次内容 上次了解了注释 注释是为了让程序更可读 注释不会影响程序运行速度 注释分为两种 单行的 以#开头 不能是字符串当中的# 多行的 三个" 三个' 多行注 ...
- [oeasy]python0033_回车_carriage_return_figlet_字体变大
回到开头 回忆上次内容 进程前后台切换 ctrl + z 把当前进程切换到后台并暂停 jobs 查看所有作业 用 fg 可以把后台进程再切回前台 fg %1 可以把指定的任务切回前台 用 bg 可 ...
- Prometheus 使用Python推送指标数据到Pushgateway
使用Python推送指标数据到Pushgateway 需求描述 实践环境 Python 3.6.5 Django 3.0.6 prometheus-client 0.11.0 代码实现 !/usr/b ...
- ElementUI 基于vue+sortable.js实现表格行拖拽
基于vue+sortable.js实现表格行拖拽 By:授客 QQ:1033553122 实践环境 sortablejs@1.13.0 vue@2.6.11 element-ui@2.13.2 安装s ...
- selenium启动Chrome配置参数问题
每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件.没有收藏.没有历史记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器, ...
- 【ElasticSearch】数据迁移方案
一.需求背景 ES环境要从单机迁移到集群上面 现在已有的数据也要搬过去,有几个索引三四千万数据大概 二.实现方案 有两种,使用ElasticDump和LogStash的ES插件 1.ElasticDu ...
- 【Hbase】1.3.1版本安装
环境: 1核4G内存128G磁盘,三台机器同一个配置 192.168.242.131 192.168.242.132 192.168.242.133 -- Linux Centos7 x64 系统平台 ...
- 【MySQL】下发功能SQL
SQL参考文章: https://www.jb51.net/article/15627.htm 下发,就是从别的表中同步数据到此表中,也可能是来自不同库的表,或者不同实例的表 下发的逻辑要求:如果没有 ...
- Jax计算框架的JIT编译的static特性
官方: https://jax.readthedocs.io/en/latest/notebooks/thinking_in_jax.html#jit-mechanics-tracing-and-st ...