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);
    }
}

? 然后添加数据迁移,更新数据库,就完成了多对多关系数据库的配置。

原文地址:https://www.cnblogs.com/NikoRanger/p/8277815.html

时间: 2024-08-28 08:22:56

EntityFramework Core2.0 多对多关系配置的相关文章

使用annotation配置hibernate(3):多对多关系配置

数据库表结构 Student.java 1 @Entity 2 @Table(name = "student") 3 public class Student { 4 @Id 5 @Column(name = "id") 6 @GenericGenerator(name = "generator",strategy = "native") 7 @GeneratedValue(generator = "generato

hibernate多对多关系配置--增删改查

hibernate多对多关联配置--并实现增删改查 hibernate就不多介绍了,这里就直接上我项目中使用的例子做说明. 数据模型 这是项目中用户和用户组的数据模型er图草稿,具体的model对象字段就以项目中的为主了. model类以及pojo接口,这里pojo接口用不上,大家测试的时候也可以去掉 package com.supre.model; import java.io.Serializable; import java.util.Set; public class User { pr

【EF Code First】 多对多关系配置

这里使用用户表(User)和项目(Project)表做示例 有这样一个需求: 用户与项目的关系是:一个用户可以发多个项目,可以参加多个项目,而项目可以有多个参与成员和一个发布者 项目结构: 实体类结构设计如下 /// <summary> /// 用户 /// </summary> public class User { public int ID { get;set;} public string NickName { get; set; } public DateTime Reg

hibernate中多表映射关系配置

1.one-to-many一对多关系的映射配置(在一的一方实体映射文件中配置) <!-- cascade属性:级联操作属性 save-update: 级联保存,保存客户时,级联保存客户关联的联系人 delete:级联删除,删除客户时,级联删除客户关联的联系人 all:级联保存+级联删除 --> <!-- inverse属性:设置是否不维护关联关系 true:不维护关联 false(默认值):维护关联 --> <!-- 一对多 --> <set name="

Hibernate多表关系配置——多对多对关系映射

多对多关系:第一个表中的一个行可以与第二个表中的一个或多个行相关.第二个表中的一个行也可以与第一个表中的一个或多个行相关. 一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多 多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的 1.实体 1.1 课程实体 package demo.entity; import java.util.HashSet; import java.util.Set; /** * 课程实体 * @auth

一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建搭建好了.net core linux的相关环境,今天就来说说ef core相关的配置及迁移: 简介: Entity Framework(以下简称EF) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,EF Core是Entity

Configure Many-to-Many(配置多对多关系)【Code-First系列】

现在学习EF Code-First多对多的配置. 这里我们举例:学生和班级实体,一个学生可以选修多个课程,多个学生也可以选修同一个课程. 一.使用数据注解特性,配置多对多的关系 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF7 { public class Student { public

Centos7.2下Nginx配置SSL支持https访问(站点是基于.Net Core2.0开发的WebApi)

准备工作 1.基于nginx部署好的站点(本文站点是基于.Net Core2.0开发的WebApi,有兴趣的同学可以跳http://www.cnblogs.com/GreedyL/p/7422796.html) 2.证书颁发机构(CA)颁发的有效证书,其中我们需要两个文件,一个是 .key文件(私钥),另一个是 .crt或.pem文件(公钥) 核心功能 ? 通过指定由受信任的证书颁发机构(CA)颁发的有效证书,将服务器配置为侦听端口上的HTTPS流量. ? 通过配置nginx.conf文件来加强

EntityFrameWork 多对多关系处理

场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别 Article和Category的代码更改如下: /// <summary> /// 文章信息 /// </summary> public class Article:ModelBase { /// <summary> /// 类别名字 /// </summary> public string Name { get; set; } public IColle