c# entity framework core树状结构增删改查

首先创建一个.net core控制台程序,添加实体类

实体类:Employee

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace TreeEntityDemo
{
    /// <summary>
    /// 员工实体
    /// </summary>
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }

        [ForeignKey(nameof(ManagerId))]
        public int? ManagerId { get; set; }
        public virtual Employee Manager { get; set; }
        public virtual ICollection<Employee> Employees { get; set; }
    }
}

定义DbContext

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace TreeEntityDemo
{
    public class AppDbContext:DbContext
    {
        public AppDbContext()
        {

        }
        public AppDbContext(DbContextOptions<AppDbContext> options):base(options)
        {

        }
        public DbSet<Employee> Employees { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Employee>()
                .HasMany(x => x.Employees)
                .WithOne(x => x.Manager)
                .HasForeignKey(x => x.ManagerId)
                .OnDelete(DeleteBehavior.ClientSetNull);
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");
            var config = builder.Build();
            optionsBuilder.UseSqlServer(config.GetConnectionString("TreeDemoDb"));

        }
    }
}

配置数据库链接:appsettings.json

{
  "ConnectionStrings": {
    "TreeDemoDb": "Server=(localdb)\\MSSQLLocalDB;Database=TreeDemoDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

添加数据库迁移 Add-Migration

add-migration InitialCreate

在Program.cs中测试

using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;

namespace TreeEntityDemo
{
   class Program
   {
       static void Main(string[] args)
       {
           using (var context = new AppDbContext())
           {
               context.Database.EnsureCreated();
               if (!context.Employees.Any())
               {
                   context.Employees.AddRange(
                       new Employee()
                       {
                           Name = "Manager1"
                       },
                       new Employee()
                       {
                           Name = "Employee1"
                       },
                       new Employee()
                       {
                           Name = "Employee2"
                       },
                       new Employee()
                       {
                           Name = "Employee3"
                       }
                   );
               }
               context.SaveChanges();
           }
           //GetParent();
           SetParent();
           GetChildren();
           Console.WriteLine("Done!");
       }

       public static void Find()
       {
           using (var context = new AppDbContext())
           {
               var employees = context.Employees.FirstOrDefault(t => t.Name == "Employee1");
               Console.WriteLine(employees.Name);
               Console.WriteLine(employees.Manager.Name);
           }
       }

       /// <summary>
       /// 删除所有
       /// </summary>
       static void RemoveAll()
       {
           using (var context = new AppDbContext())
           {
               var employees = context.Employees
                   .Where(t => !string.IsNullOrEmpty(t.Name));
               context.RemoveRange(employees);
               context.SaveChanges();
           }
       }

       /// <summary>
       /// 获取父类
       /// </summary>
       static void SetParent()
       {
           using (var context = new AppDbContext())
           {
               var employee1 = context.Employees.FirstOrDefault(t => t.Name == "Employee1");
               var employee2 = context.Employees.FirstOrDefault(t => t.Name == "Employee2");
               var employee3 = context.Employees.FirstOrDefault(t => t.Name == "Employee3");
               var manager1 = context.Employees.FirstOrDefault(t => t.Name == "Manager1");
               employee1.Manager = manager1;
               employee2.Manager = manager1;
               employee3.Manager = manager1;
               context.Update(employee1);
               context.Update(employee2);
               context.Update(employee3);
               context.SaveChanges();
           }
       }

       /// <summary>
       /// 获取子类
       /// </summary>
       static void GetParent()
       {
           using (var context = new AppDbContext())
           {
               var employee1 = context.Employees.Include(t=>t.Manager).FirstOrDefault(t => t.Name == "Employee1");
               if (employee1.Manager==null)
               {
                   Console.WriteLine("null");
               }
               else
               {
                   Console.WriteLine(employee1.Manager.Name);
               }
           }
       }

       static void GetChildren()
       {
           using (var context = new AppDbContext())
           {
               var manager1 = context.Employees.FirstOrDefault(t => t.Name == "Manager1");
               var children = context.Employees.Where(t => t.ManagerId == manager1.Id);
               if (children!=null && children.Count()>0)
               {
                   foreach (var item in children)
                   {
                       Console.WriteLine(item.Name);
                   }
               }

           }
       }

       static void DeleteParent()
       {
           using (var context = new AppDbContext())
           {
               var manager1 = context.Employees.FirstOrDefault(t => t.Name == "Manager1");

               context.Employees.Remove(manager1);
               context.SaveChanges();
           }
       }

   }
}

原文地址:https://www.cnblogs.com/AlexanderZhao/p/12640506.html

时间: 2024-10-24 06:06:07

c# entity framework core树状结构增删改查的相关文章

EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

(1)通用类用法 其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo>(); 3 UserInfo userinfo = new UserInfo(); 4 userinfo.Name = "1"; 5 dbhelper.Add(userinfo); 6 7 //根据条件查找列表 8 var entityes = dbhelper.F

基于Entity Framework的自定义分页,增删改的通用实现

简介 之前写个一个基于Dapper的分页实现,现在再来写一个基于Entity Framework的分页实现,以及增删改的通用实现. 代码 还是先上代码:https://github.com/jinweijie/EF.GenericRepository 如何运行示例 还是像先前一样: 1. 先Clone下代码,在Database里面解压缩Database.7z 2. Attach到Sql Server LocalDB上.如果你用的不是Sql Server的LocalDB,你需要更改App.Conf

Entity Framework 学习系列(4) - EF 增删改

目录 写在前面 一.开发环境 二.创建项目 三.新增 1.单表新增 2.批量新增 3.多表新增 四.编辑 1.先查询,后编辑 2.创建实体,后编辑 五.删除 写在前面 在上一小节中,学习了如何 通过Code First + MySql 的方式实现数据的迁移. 这一下节中,总结 EF的增删改. 一.开发环境 开发工具:Visual Studio 2019 开发环境:Win 10 家庭版 数据库:MySQL 8.0.17 二.创建项目 1.打开Visual Studio 2019 新建->创建程序台

Core Data 数据操作 增删改查

所有操作都基于Core Data框架相关 API,工程需要添加CoreData.framework支持 1.增  NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext: 利用NSEntityDescription工厂方法创建Entity AppDelegate *appDelegate = [UIApplication sharedApplication].delegate; //get NSMan

ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查

原文:ASP.NET CORE系列[二]使用Entity Framework Core进行增删改查 介绍 EntityFrameworkCore EF core 是一个轻量级的,可扩展的EF的跨平台版本.对于EF而言 EF core 包含许多提升和新特性,同时 EF core 是一个全新的代码库,并不如 EF6 那么成熟和稳定.EF core 保持了和EF相似的开发体验,大多数顶级API都被保留了下来,所以,如果你用过EF6,那么上手EF core你会觉得非常轻松和熟悉,EF core 构建在一

UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软推荐使用Sqlite吧! 2,简单!就只有一个类库没有多余的参照什么的.不像其他数据库还得做复杂配置什么的麻烦! 3,不需要数据库服务,数据服务和客户都在同一个进程里面.如下图: 4,作为存储系统它只支持一个用户一个数据实体. 5,跨平台跨结构,这个好! Sqlite主要使用内容 如果想充分使用好S

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添加一个User类: namespace MyFirstApp.Models { public class User { public int ID { get; set; } public string Name { get; set; } public string Email { get; se

[UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Entity Framework Core(Entity Framework 7)下文将简称:EF 1.在UWP中使用EF需要更新Microsoft.NETCore.UniversalWindowsPlatform到大于“5.2.2”的版本. 2.直接在“程序包管理器控制台”输入命令来更新:Update-P

使用 Entity Framework Core 时,通过代码自动进行 Migration

一 介绍 在使用 Entity Framework Core (下面就叫 EF Core 吧)进行开发时,如果模型有变动,我们要在用 EF Core 提供的命令行工具进行手工迁移,然后再运行程序.但是为了效率,我想能不能在程序的入口处进行 Migration 呢?从个人经验来说应该是可以,因为 EF Tool 虽然提供了 CLI 但是它最终也是被程序解析这些命令.下面就开始分析,如何通过代码进行 Migration . 二 分析 首先我们要先了解,在使用 EF Core 时,要执行两个步骤: 第