EFCore-13 多对多关系配置

这篇具有很好参考价值的文章主要介绍了EFCore-13 多对多关系配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学生与老师的关系,是一个常见的多对多的关系模型,一个老师有多个学生,一个学生也可能有多个老师。关系模型图如下所示:

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

学生1的老师为老师1、老师2

学生2的老师为老师2、老师3

学生3的老师为老师1、老师2、老师3

下面用程序实现这样的关系模型。

新建一个控制台应用程序

控制台项目结构:

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

项目引用的程序集:

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

Microsoft.EntityFrameworkCore.SqlServer 

Microsoft.EntityFrameworkCore.Tools 

1.在实体类中定义关系属性

Student.cs

using System.Collections.Generic;

namespace 多对多
{
    /// <summary>
    /// 学生实体
    /// </summary>
    class Student
    {
        public long Id { get; set; }

        public string Name { get; set; }

        public List<Teacher> Teachers { get; set; } = new List<Teacher>();
    }
}

Teacher.cs

using System.Collections.Generic;

namespace 多对多
{
    /// <summary>
    /// 老师实体
    /// </summary>
    class Teacher
    {
        public long Id { get; set; }

        public string Name { get; set; }

        public List<Student> Students { get; set; } = new List<Student>();
    }
}

2.FluentAPI关系配置

StudentConfig.cs

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace 多对多
{
    class StudentConfig : IEntityTypeConfiguration<Student>
    {
        public void Configure(EntityTypeBuilder<Student> builder)
        {
            builder.ToTable("T_Students");
            //配置学生与老师的多对多关系,并指定中间关系表的表名
            builder.HasMany<Teacher>(s => s.Teachers).WithMany(t => t.Students).UsingEntity(j => j.ToTable("T_Students_Teachers"));
        }
    }
}

TeacherConfig.cs

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace 多对多
{
    class TeacherConfig : IEntityTypeConfiguration<Teacher>
    {
        public void Configure(EntityTypeBuilder<Teacher> builder)
        {
            builder.ToTable("T_Teachers");
        }
    }
}

3.DbContext配置

用于定义数据库表和数据库链接等信息

MyDbContext.cs

using Microsoft.EntityFrameworkCore;

namespace 多对多
{
    class MyDbContext : DbContext
    {

        public DbSet<Student> students { get; set; }
        public DbSet<Teacher> teachers { get; set; }


        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);

            string connStr = "Server=.;Database=EFCoreDemo2;Trusted_Connection=True;MultipleActiveResultSets=true";
            optionsBuilder.UseSqlServer(connStr);


            //打印log日志
            //optionsBuilder.LogTo(msg =>
            //{
            //    if (msg.Contains("CommandExecuting"))
            //    {
            //        Console.WriteLine(msg);
            //    }
            //    else
            //    {
            //        return;
            //    }
            //});
        }



        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            //从当前程序集加载所有IEntityTypeConfiguration
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }
}

4.生成并执行数据库迁移脚本

使用命令生成数据库表创建脚本,并执行相关脚本。具体操作参考文章

EFCore-5 Migration操作

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

 这里要注意下,虽然在代码中只定义了两个实体类,但是在StudentConfig.cs中配置的关系为多对多,所以efcore会自动生成一张中间关系表,用来记录两个表数据的对应关系。

中间关系表字段信息如下:

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

记录了两个表的主键字段值

5.往数据库表插入记录

using Microsoft.EntityFrameworkCore;
using System;
using System.Threading.Tasks;

namespace 多对多
{
    class Program
    {
        static async Task Main(string[] args)
        {
            //插入数据
            using (MyDbContext ctx = new MyDbContext())
            {
                Student s1 = new Student() { Name = "张三" };
                Student s2 = new Student() { Name = "李四" };
                Student s3 = new Student() { Name = "王五" };

                Teacher t1 = new Teacher() { Name = "Tom" };
                Teacher t2 = new Teacher() { Name = "Jerry" };
                Teacher t3 = new Teacher() { Name = "Zack" };

                s1.Teachers.Add(t1);
                s1.Teachers.Add(t2);

                s2.Teachers.Add(t2);
                s2.Teachers.Add(t3);

                s3.Teachers.Add(t1);
                s3.Teachers.Add(t2);
                s3.Teachers.Add(t3);

                ctx.students.Add(s1);
                ctx.students.Add(s2);
                ctx.students.Add(s3);

                ctx.teachers.Add(t1);
                ctx.teachers.Add(t2);
                ctx.teachers.Add(t3);

                await ctx.SaveChangesAsync();
            }
          
        }
    }
}

 查询数据库表记录

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

 6.查询所有老师,并查询老师对应的学生

using Microsoft.EntityFrameworkCore;
using System;
using System.Threading.Tasks;

namespace 多对多
{
    class Program
    {
        static async Task Main(string[] args)
        {
            //查询所有老师,并查询老师对应的学生
            using (MyDbContext ctx = new MyDbContext())
            {
                var teachers = ctx.teachers.Include(t => t.Students);
                foreach (var t in teachers)
                {
                    Console.WriteLine(t.Name);
                    foreach (var s in t.Students)
                    {
                        Console.WriteLine("\t" + s.Name);
                    }
                }
            }
        }
    }
}

执行结果:

efcore 多对多,EFCore,杨中科.net6学习,efcore,多对多

 打印出老师的名字和老师对应学生的名字。文章来源地址https://www.toymoban.com/news/detail-518562.html

到了这里,关于EFCore-13 多对多关系配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET Core NET6 EFCore MySQL

    ASP.NET Core 下使用 EFCore 和 .NET Framework 下使用有点区别。 参考官方文档:https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html 1.创建 ASP.NET Core Web应用 项目 创建新的项目的 Program.cs 文件中使用了顶级语句,与NET5 有所区别。 .NET 6 的 创建的项目使用了C# 顶级语句 ht

    2024年02月07日
    浏览(56)
  • JPA实现多对多关系

    本文已收录于专栏 《Java》   多对多关系是指两个实体之间存在多对多的关联关系。在数据库中,多对多关系无法直接表示,需要通过中间表来实现。   举个例子,假设有两个实体类:学生(Student)和课程(Course)。一个学生可以选择多门课程,而一门课程也可以被多

    2024年02月17日
    浏览(40)
  • 杨中科 .NETCORE ENTITY FRAMEWORK CORE-1 EFCORE 第一部分

    1、说明: 本课程需要你有数据库、SOL等基础知识。 2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库 比如插入: 比如查询: 3、有哪些ORM: EF core(官方推荐)、Dapper、SqlSugar、FreeSql等 1、Entity Framework Core(EF Coxe)是微软官方的ORM框架优点: 功能强大、官方支持、生

    2024年02月02日
    浏览(63)
  • .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移

    接上期文章《.NET6项目连接数据库方式方法》,有人问了我几个问题,现在就这几个问题,拓展延申一下创建实体类、数据库。把ORM框架和数据迁移都写进去。 我的项目是在Linux上创建的,使用的是vscode开发工具远程开发。为了方便大家阅读和操作,我将项目down到我的本地电

    2024年02月05日
    浏览(51)
  • 杨中科 EFCORE 第五部分 同样的Linq 被不同数据据翻译为不同SQL

    SOLServer: select top(3) * from t MySOL: select * from t LIMIT 3 Oracle: select * from t where ROWNUM=3 同样的C#语句在不同数据库中被EF Core翻译成不同的SQL语句 因此迁移脚本不能跨数据库。 通过给Add-Migration命令添加“-OutputDir”参数的形式来在同一个项目中为不同的数据库生成不同的迁移脚本。本

    2024年01月20日
    浏览(38)
  • Django基础入门⑪:DjangoDjango数据表关联(一对一,一对多,多对多关系)

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 Django数据表关

    2024年02月12日
    浏览(63)
  • Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。

    当在模型中为关系字段添加了 related_name 参数后,您可以使用该参数指定的名称来引用反向关系。下面是一个简单的例子来说明如何引用反向关系。 假设您有以下两个模型: 在上面的例子中, Book 模型有一个外键字段 author ,它关联到 Author 模型。通过添加 related_name=\\\'books\\\' 参

    2024年02月16日
    浏览(48)
  • 在Django的数据库操作模型中,怎样获取一对多或多对多关系中的所有“多”?(使用特殊属性:逆向关系管理器)

    当一个模型通过外键或多对多字段与另一个模型建立关联时,Django会自动为该模型生成逆向关系管理器。这个逆向关系管理器的名称是通过在模型类名后面添加 _set 来生成的。在逆向关系管理器上,你可以使用多种查询方法来访问相关对象。 让我们以一个示例来说明。假设你

    2024年02月16日
    浏览(51)
  • EFCore 使用FluntApi配置 全局查询筛选器

    我们在类中通常会有一个属性为 IsDel来表示软删除或也称逻辑删除,这个属性会导致我们在进行查询操作时,每一次都要 .where(s=s.IsDel==false) 非常的麻烦。在使用efCore时可以通过配置查询筛选器来很好的解决这个问题。 我们SysUser类中的IsDel属性代表我们的软删除。 我这里自己

    2024年02月05日
    浏览(43)
  • asp.net core EFCore 属性配置与DbContext

    Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。用于程序中的class类和数据库中的表互相之间建立映射关系。在学习过程中,EFCore中的属性配置显的尤为重要它是学习好asp.net core的基础是配置数据库表结构的重要基石。本篇内容为

    2024年02月07日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包