EntityFramework EF CORE 一对多、多对多添加、修改

 更新时间:2020年4月23日 11:01  点击:536
  1. 创建.net core 控制台应用程序

  2. 添加如下NuGet包:

    Microsoft.EntityFrameworkCore

    Microsoft.EntityFrameworkCore.SqlServer

    Microsoft.EntityFrameworkCore.Tools

  3. 添加如下实体类:



/// <summary>
/// 部门
/// </summary>
public class Dept
    {
        private Dept() { }
        /// <summary>
        /// 单独添加部门
        /// </summary>
        /// <param name="name"></param>
        /// <param name="parentId"></param>
        public Dept(string name, long? parentId)
        {
            Name = name;
            ParentId = parentId;
        }
        /// <summary>
        /// 添加部门并添加用户
        /// </summary>
        /// <param name="name"></param>
        /// <param name="parentId"></param>
        /// <param name="UserDepts"></param>
        public Dept(string name, long? parentId, ICollection<UserDept> userDepts)
        {
            Name = name;
            ParentId = parentId;
            UserDepts = userDepts;
        }
        public long Id { get; private set; }
        public string Name { get; private set; }
        public long? ParentId { get; private set; }
        public virtual Dept Parent { get; private set; }
        public virtual ICollection<Dept> Depts { get; private set; }
        public virtual ICollection<UserDept> UserDepts { get; private set; }
    }
 
/// <summary>
/// 用户
/// </summary>
public class User
{
    private User() { }
    public User(string name, string phone, int sex)
    {
        Name = name;
        Phone = phone;
        Sex = sex;
    }
 
    public User(long id,string name, string phone, int sex)
    {
        Name = name;
        Phone = phone;
        Sex = sex;
        Id = id;
    }
 
    public User(string name, string phone, int sex, ICollection<UserDept> userDepts, ICollection<UserCompany> userCompanys)
    {
        Name = name;
        Phone = phone;
        Sex = sex;
        UserDepts = userDepts;
        UserCompanys = userCompanys;
    }
    
    public User(long id,string name, string phone, int sex, ICollection<UserDept> userDepts, ICollection<UserCompany> userCompanys)
    {
        Name = name;
        Phone = phone;
        Sex = sex;
        UserDepts = userDepts;
        UserCompanys = userCompanys;
        Id = id;
    }
    public long Id { get; private set; }
    public string Name { get; private set; }
    public string Phone { get; private set; }
    public int Sex { get; private set; }
    public virtual ICollection<UserDept> UserDepts { get; private set; }
    public virtual ICollection<UserCompany> UserCompanys { get; private set; }
}
 
/// <summary>
/// 用户公司
/// </summary>
public class UserCompany
{
   private UserCompany() { }
        /// <summary>
        /// 通过用户添加公司
        /// </summary>
        /// <param name="name"></param>
        public UserCompany(string name)
        {
            Name = name;
        }
        /// <summary>
        /// 单独为用户添加公司
        /// </summary>
        /// <param name="name"></param>
        /// <param name="userId"></param>
        public UserCompany(string name, long userId)
        {
            Name = name;
            UserId = userId;
        }
        /// <summary>
        /// 通过公司添加用户
        /// </summary>
        /// <param name="name"></param>
        /// <param name="user"></param>
        public UserCompany(string name, User user)
        {
            Name = name;
            User = user;
        }

        public UserCompany(long id,string name)
        {
            Id = id;
            Name = name;
        }

        public long Id { get; private set; }
        public string Name { get; private set; }
        public long UserId { get; private set; }
        public virtual User User { get; private set; }
}
 
/// <summary>
/// 用户部门
/// </summary>
public class UserDept
{
    private UserDept() { }
        public UserDept(long? userId, long? deptId)
        {
            if (userId.HasValue)
                UserId = userId.Value;

            if (deptId.HasValue)
                DeptId = deptId.Value;
        }
        public UserDept(long? id, long? userId, long? deptId)
        {
            if (id.HasValue)
                Id = id.Value;

            if (userId.HasValue)
                UserId = userId.Value;

            if (deptId.HasValue)
                DeptId = deptId.Value;
        }
        public long Id { get; private set; }
        public long UserId { get; private set; }
        public virtual User User { get; private set; }
        public long DeptId { get; private set; }
        public virtual Dept Dept { get; private set; }
}

添加DbContext:

public class TestContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-2H9332M;Initial Catalog=Test;Integrated Security=True");
    }
 
    public DbSet<User> Users { get; set; }
    public DbSet<Dept> Depts { get; set; }
    public DbSet<UserCompany> UserCompanys { get; set; }
    public DbSet<UserDept> UserDepts { get; set; }
}


在程序包控件管理台分别执行如下命令:

 add-migration init 
 update-database


在Program类中添加如下测试代码:

class Program
{
    static void Main(string[] args)
    {
        var context = new TestContext();
 
        //添加部门
        context.Set<Dept>().Add(new Dept("部门1", null));
        //添加用户
        context.Set<User>().Add(new User("用户1", "1111111", 0));
        //添加公司
        context.Set<UserCompany>().Add(new UserCompany("公司1", 1));
 
        //添加部门、用户部门
        context.Set<Dept>().Add(new Dept(
                 "部门2",
                  1,
                  new List<UserDept>()
                  {
                     new UserDept(1,null)
                  }));
 
        //添加用户、用户部门、用户公司
        context.Set<User>().Add(new User(
            "张三",
            "13037318682",
            1,
            new List<UserDept>
            {
                new UserDept(null, 1)
            },
            new List<UserCompany>
            {
                new UserCompany("ABC公司")
            }));
 
        //添加用户、公司
        context.Set<UserCompany>().Add(new UserCompany("公司2", new User("用户2", "222222", 2)));
 
        context.SaveChanges();
    }
}

接着我们来测试下一对多的更新代码如下:

//更新用户、用户部门、用户公司
context.Set<User>().Update(new User(1, "李四", "13037318682", 1,
    new List<UserDept> {
        new UserDept(null,2)
    },
    new List<UserCompany>
    {
        new UserCompany("ABC公司修改")
    }));
context.SaveChanges();

使用这种方式修改会在UserDept、UserCompany表中新增一条数据,这种结果也正是我们业务所需要的。

如果我想修改一对多中的子表某一条记录而不是增加一条数据又该如何操作呢?请看如下代码:

context.Set<User>().Update(new User(2, "用户2修改2", "13037318682", 1,
    new List<UserDept> {
        new UserDept(2,2,2)
    },
    new List<UserCompany>
    {
        new UserCompany(1,"ABCD公司修改")
    }));
 
context.SaveChanges();

由此可以看出在使用修改操作时需要指定主键Id。 


示例源码下载:https://gitee.com/smallmuda/efcoredemo

[!--infotagslink--]

相关文章

  • .NET Core下使用Kafka的方法步骤

    这篇文章主要介绍了.NET Core下使用Kafka的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • Django def clean()函数对表单中的数据进行验证操作

    这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09
  • 详解.NET Core 3.0 里新的JSON API

    这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

    这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 记一次EFCore类型转换错误及解决方案

    这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
  • Vue3中reactive函数toRef函数ref函数简介

    这篇文章主要介绍了Vue3中的三种函数,分别对reactive函数toRef函数以及ref函数原理及使用作了简单介绍,有需要的朋友可以借鉴参考下...2021-09-24
  • 详解ASP.NET Core 中基于工厂的中间件激活的实现方法

    这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • c#基础系列之ref和out的深入理解

    有过C#基础知识的都应该清楚Ref和Out的使用方法,所以下面这篇文章主要给大家介绍了关于c#基础系列之ref和out的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...2020-06-25
  • 详解.NET Core 使用HttpClient SSL请求出错的解决办法

    这篇文章主要介绍了.NET Core 使用HttpClient SSL请求出错的解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
  • 详解Ref在React中的交叉用法

    众所周知,react推出了hooks之后,很多项目就开始往hooks上靠拢,所以也就出现了class和hooks交叉使用的项目。这个时候使用ref需要注意一些东西...2021-06-20
  • .net EF Core专题:EF Core 读取数据时发生了什么?

    这篇文章主要介绍了EF Core 读取数据的的相关知识,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2021-09-22
  • 详解ASP.NET Core Token认证

    这篇文章主要介绍了详解ASP.NET Core Token认证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2021-09-22
  • Apache Reference Manual (10)

    Satisfy directive Syntax: Satisfy 'any' or 'all' Default: Satisfy all Context: directory, .htaccess Status: core Compatibility: Satisfy is only available...2016-11-25
  • .NET Core如何获取操作系统中的各种信息

    .net core是最近讨论频率很高的话题,下面这篇文章主要给大家介绍了关于利用.NET Core如何获取操作系统中各种信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧...2021-09-22
  • asp.net core MVC之实现基于token的认证

    这篇文章主要介绍了asp.net core MVC之实现基于token的认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-07
  • ASP.NET Core如何注入多个服务实现类

    这篇文章主要介绍了ASP.NET Core如何注入多个服务实现类的相关资料,需要的朋友可以参考下面文章的具体内容...2021-09-22
  • ASP.NET Core使用JWT认证授权的方法

    这篇文章主要介绍了ASP.NET Core使用JWT认证授权的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • ASP.NET core Web中使用appsettings.json配置文件的方法

    这篇文章主要给大家介绍了在ASP.NET core Web中使用appsettings.json配置文件的方法,文中给出了详细的示例代码,需要的朋友可以参考学习,下面来一起看看吧。...2021-09-22