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

   }
}

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

上一篇:linux:合并类别代码,查看文本文件的头部、尾部行内容 及查看行数


下一篇:Windows之wsl简单配置