前言

Many to many 是 EF Core 5.0 才开始有的, 以前都用 2 个 1-n 来实现的.

由于它比 1-n 复杂, 所以有必要写一遍来记入一下.

参考:

Relationships

Property bag entity types

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的更多相关文章

  1. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  2. Asp.net Core 通过 Ef Core 访问、管理Mysql

    本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环 ...

  3. EF Core 杂记

    本系列文章,将介绍本人在学习和使用EF Core的过程中的收获与心得. 或许有的地方讲的错误 欢迎大家批评指出. 1.EF Core 数据库迁移(Migration)

  4. MySQL官方.NET Core驱动已出,支持EF Core

    千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...

  5. EF Core 1.0 和 SQLServer 2008 分页的问题

    EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...

  6. EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

    官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...

  7. EF Core CodeFirst实践 ( 使用MS SqlServer)

    这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择  ASP.NET Core Web Application (.NET Core) ...

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

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

  10. 再谈EF Core内存数据库单元测试问题

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在用EF Core的内存数据库进行单元测试的时候遇到"无法访问已释放的对象& ...

随机推荐

  1. git push origin master和git push的区别

    1.git push origin master 指定远程仓库名和分支名. 2.git push 不指定远程仓库名和分支名. 3. 这两者的区别:git push是git push origin ma ...

  2. MFC BCG 一些记录

    MFC:    UpdateData (TRUE) // 更新值到控件    UpdateData (TRUE) // 更新控件到值DECLAREMESSAGEMAPBEGINMESSAGEMAP(d ...

  3. 逆向动态加载Dex(内存加载class)

    逆向一个app, 其核心算法是通过反射调用的, 反编译软件中无法找到该类, 并且也无法hook. Java.perform(function(){ Java.enumerateClassLoaders ...

  4. mysql进阶笔记

    说明:此文章并非原创,参考极客时间文章<MySQL实战45讲>做的一些笔记,方便自己查阅,有兴趣可以自行去极客时间阅读,内容非常给力. mysql引擎  Innodb: Page是Inno ...

  5. Jmeter二次开发函数之入门

    背景:Jmeter不能满足我们的参数需求,如生成手机号码.身份证号码等业务,固对jmeter进行二次函数开发. jmeter提供了接口供用户进行二次开发,我们只需引入包进行编辑.从jmeter规范上, ...

  6. 【Vant】Vant 开发笔记

    手机端元素高度控制: 界面div标签超出了可视区域时,一定要设置高度: 让元素保持在可视区域滑动,Popup组件从底部渲染时才能正常 <div style="height: 100vh ...

  7. 在计算机论文中suppose suggest assume 用法上的区别

    ChatGPT3.5的答案: 在计算机论文中,"suppose," "suggest," 和 "assume" 有不同的用法和含义.它们在表 ...

  8. AI辅助教学,甚至AI教学,逐渐成为可能

    看新闻,有感: 太火爆!一门课,两个月吸粉十五万人!企业纷纷布局!千亿级大市场,来了?

  9. Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么(续)

    前文: Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么 从前文我们知道,jax的jit中尽可能的不要放入循环结构,因为在jit编译时会将循环结构暂开,因而会消耗掉大量的时间进 ...

  10. xshell打开vim后颜色异常——xshell连接ubuntu打开vim后界面覆盖一层绿色

    参考原文: https://blog.csdn.net/Blank_Shen/article/details/106527312 =================================== ...