前言

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. webgl未使用独立显卡报告2

    楔子 在上一篇文章 <# [https://juejin.cn/post/7074771064286347301] webgl未使用独立显卡报告> 发表后,有读者在公众号给我发了一段评论, ...

  2. CGI,FastCGI和PHP-FPM之间的关系和区别

    什么是CGI?早期的web server只可以处理简单的静态web文件,但是随着技术的发展出现动态语言如PHP,Python.PHP语言交给PHP解析器进行处理,但是处理之后如何和web server ...

  3. 变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用

    巴图自动化Profinet转Modbus模块(BT-MDPN10)是一种用于不同通讯协议之间互连的设备,它可以将Profinet与Modbus这两种不同的通讯协议进行转换,从而实现设备之间的通讯和数据 ...

  4. 学习笔记--Java中方法递归调用

    Java中方法递归调用 public class RecursionTest01{ public static void main(String[] args){ System.out.println ...

  5. CF1951

    A link 这个题就是讨论. 首先,如果没有\(1\)就一定可以. 如果有\(1\). 如果长度为\(2\)一定不行. \(1\)的个数为奇数不行. 如果为偶数 有一个小点:如果是\(2\)个\(1 ...

  6. scanf、cin及其优化、快读性能测试

    为了让大家了解C++各种IO方式的性能,于是就有了这篇文章. 本次测试采取的数据均为 \(10^6\) 个不超过 \(10^8\) 随机正整数. 测试代码: #include<bits/stdc ...

  7. java8interface的新特性:default,static,funcation

    default:默认方法 在类接口中可以直接定义的方法,实现接口的类可以直接使用 使用案例: public interface MyInterface { default void display() ...

  8. windows生成苹果私钥证书p12证书和profile文件的方法

    hbuilderx出现已经有差不多10年时间了,现在越来越多的企业,开始使用跨平台性更优秀的uniapp来开发ios app. 开发ios app的时候,打包需要苹果的私钥证书和证书profile文件 ...

  9. 这才是 PHP 高性能框架 Workerman 的立命之本

    大家好,我是码农先森. 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表.有些朋友可 ...

  10. win10安装和使用wireshark

    win10安装和使用wiresharkhttps://blog.csdn.net/qq_34732729/article/details/105126146https://blog.csdn.net/ ...