zoukankan      html  css  js  c++  java
  • EF CORE EntityFrameworkCore中关系模式一对一、一对多、多对多的使用

    EF CORE EntityFrameworkCore中关系模式一对一、一对多、多对多的使用。

    使用VS2019 新建.Net Core Console控制台项目,使用NuGet程序包管理器添加引用如下:

    具体代码如下:

    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    using System;
    using Microsoft.Extensions.Logging;
    using System.Collections.Generic;
    
    namespace TestNetCore
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                TestDBConext testDB = new TestDBConext();
                testDB.Database.EnsureDeleted();
                if (testDB.Database.EnsureCreated())
                {
                    Console.WriteLine("数据库创建成功");
                }
    
                #region 测试一对一
                //Person person = testDB.Find<Person>(10);
                //testDB.Remove(person);
                //testDB.SaveChanges(); 
                #endregion
    
                #region 测试一对多
                //Product product = testDB.Find<Product>(10);
                //testDB.Remove(product);
                //testDB.SaveChanges();
                #endregion
    
                #region 测试多对多
                //Student student = testDB.Find<Student>(2);
                //testDB.Remove(student);
                //testDB.SaveChanges();
    
                //Teacher teacher = testDB.Find<Teacher>(8);
                //testDB.Remove(teacher);
                //testDB.SaveChanges();
                #endregion
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine("成功");
                Console.ReadLine();
            }
        }
    
        #region EntityFrameworkCore DbContext
        public class TestDBConext : DbContext
        {
            public TestDBConext()
            {
            }
    
            //public DbSet<Person> Persons { get; set; }第一种EF to DB映射方式
            //public DbSet<IdCard> IdCards { get; set; }第一种EF to DB映射方式
    
            //public DbSet<Product> Products { get; set; }第一种EF to DB映射方式
            //public DbSet<Category> Categorys { get; set; }第一种EF to DB映射方式 
    
            //public DbSet<Teacher> Teachers { get; set; }第一种EF to DB映射方式
            //public DbSet<Student> Students { get; set; }第一种EF to DB映射方式
    
            public static readonly ILoggerFactory loggerFactory = LoggerFactory.Create(op => op.AddConsole().AddConsole());
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlServer("Server =localhost;Database=mytest;Persist Security Info=True;User Id=sa;Password=sa123;");
                //optionsBuilder.UseMySql("Server =localhost;Database=mytest;User Id=root;Password=123456;");
                optionsBuilder.UseLoggerFactory(loggerFactory);
                base.OnConfiguring(optionsBuilder);
            }
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                #region 一对一
                //HasData()初始化参数
                //List<Person> list = new List<Person>();
                //List<IdCard> listIdCard = new List<IdCard>();
                //for (int i = 0; i < 10; i++)
                //{
                //    Person person = new Person { Id = i + 1, Name = $"{i}:name", IdCardId = i + 2 };
                //    list.Add(person);
                //    IdCard idCard = new IdCard { Id = i + 2, Name = $"{i}:name", PersonId = i + 1 };
                //    listIdCard.Add(idCard);
                //}
    
                #region 第二种EF to DB映射方式
                //创建表结构
                ////modelBuilder.Entity<Person>()
                ////.HasOne(a => a.IdCard).WithOne(a => a.Person).
                ////HasForeignKey<IdCard>(a => a.PersonId).OnDelete(DeleteBehavior.Cascade)//默认级联删除,即删除person就删除IdCard,这一句和下面一句效果一样
                //modelBuilder.Entity<Person>().HasOne(a => a.IdCard).WithOne(a => a.Person).HasForeignKey<IdCard>(a => a.PersonId);
                //初始化表数据
                //modelBuilder.Entity<Person>().HasData(list);
                //modelBuilder.Entity<IdCard>().HasData(listIdCard);
                #endregion
    
                #region 第三种EF to DB映射方式
                ////创建表结构
                //modelBuilder.ApplyConfiguration(new PersonMap());
                //modelBuilder.ApplyConfiguration(new IdCardMap());
                ////初始化表数据
                //modelBuilder.Entity<Person>().HasData(list);
                //modelBuilder.Entity<IdCard>().HasData(listIdCard);
                #endregion
                #endregion
    
                #region 一对多
                ////HasData()初始化参数
                //List<Product> list = new List<Product>();
                //List<Category> listCategory = new List<Category>();
                ////List<Category> productCategories = new List<Category>();
                //for (int i = 0; i < 10; i++)
                //{
                //    Product product = new Product { Id = i + 1, ProductName = $"{i}:Productname" };
                //    //var arry = Enumerable.Range(1, i).ToArray();
                //    for (int j = 0; j < i; j++)
                //    {
                //        Category category = new Category { Id = j + i * 10, CategoryName = $"{j}:Categoryname", ProductId = product.Id };
                //        listCategory.Add(category);
                //    }
                //    list.Add(product);
                //}
    
                #region 第二种EF to DB映射方式
                ////创建表结构
                ////modelBuilder.Entity<Product>().HasMany(a => a.Categories).WithOne(a => a.Product).OnDelete(DeleteBehavior.Cascade)//默认级联删除,即删除person就删除IdCard,
                ////这一句和下面一句效果一样
                //modelBuilder.Entity<Product>().HasMany(a => a.Categories).WithOne(a => a.Product);
                ////初始化表数据
                //modelBuilder.Entity<Product>().HasData(list);
                //modelBuilder.Entity<Category>().HasData(listCategory);
                #endregion
    
                #region 第三种EF to DB映射方式
                ////创建表结构
                //modelBuilder.ApplyConfiguration(new ProductMap());
                //modelBuilder.ApplyConfiguration(new CategoryMap());
                ////初始化表数据
                //modelBuilder.Entity<Product>().HasData(list);
                //modelBuilder.Entity<Category>().HasData(listCategory);
                #endregion
                #endregion
    
                #region 多对多
                //HasData()初始化参数
    
                List<Student> list = new List<Student>
                {
                    new Student { Id = 1, StudentName = $"StudentName 1" },
                    new Student { Id = 2, StudentName = $"StudentName 2" },
                    new Student { Id = 3, StudentName = $"StudentName 3" },
                    new Student { Id = 4, StudentName = $"StudentName 4" }
                };
                List<Teacher> listTeacher = new List<Teacher>
                {
                    new Teacher { Id = 6, TeacherName = $"StudentName 6" },
                    new Teacher { Id = 7, TeacherName = $"StudentName 7" },
                    new Teacher { Id = 8, TeacherName = $"StudentName 8" },
                     new Teacher { Id = 9, TeacherName = $"StudentName 9" }
                };
                List<StudentTeacher> studentTeacher = new List<StudentTeacher>
                {
                    new StudentTeacher { StudentId = 1, TeacherId = 6 },
                    new StudentTeacher { StudentId = 2, TeacherId = 6 },
                    new StudentTeacher { StudentId = 3, TeacherId = 6 },
                    new StudentTeacher { StudentId = 4, TeacherId = 6 },
                    new StudentTeacher { StudentId = 2, TeacherId = 8 },
                    new StudentTeacher { StudentId = 3, TeacherId = 8 },
                    new StudentTeacher { StudentId = 4, TeacherId = 8 }
                };
    
                #region 第二种EF to DB映射方式
                //创建表结构
                //////modelBuilder.Entity<Student>().HasMany(a => a.StudentTeachers).WithOne(a => a.Student).OnDelete(DeleteBehavior.Cascade)
                //////modelBuilder.Entity<Teacher>().HasMany(a => a.StudentTeachers).WithOne(a => a.Teacher).OnDelete(DeleteBehavior.Cascade)
                //modelBuilder.Entity<Student>().HasMany(a => a.StudentTeachers).WithOne(a => a.Student);
                //modelBuilder.Entity<Teacher>().HasMany(a => a.StudentTeachers).WithOne(a => a.Teacher);
                //modelBuilder.Entity<StudentTeacher>().HasKey(a => new { a.StudentId, a.TeacherId });
                ////modelBuilder.Entity<StudentTeacher>().HasOne(a => a.Student).WithMany(a => a.StudentTeachers).HasForeignKey(a => a.StudentId);
                ////modelBuilder.Entity<StudentTeacher>().HasOne(a => a.Teacher).WithMany(a => a.StudentTeachers).HasForeignKey(a => a.TeacherId);
                //////初始化表数据
                //modelBuilder.Entity<Student>().HasData(list);
                //modelBuilder.Entity<Teacher>().HasData(listTeacher);
                //modelBuilder.Entity<StudentTeacher>().HasData(studentTeacher);
                #endregion
    
                #region 第三种EF to DB映射方式
                ////创建表结构
                modelBuilder.ApplyConfiguration(new StudentMap());
                modelBuilder.ApplyConfiguration(new TeacherMap());
                modelBuilder.ApplyConfiguration(new StudentTeacherMap());
                ////初始化表数据
                modelBuilder.Entity<Student>().HasData(list);
                modelBuilder.Entity<Teacher>().HasData(listTeacher);
                modelBuilder.Entity<StudentTeacher>().HasData(studentTeacher);
                #endregion
                #endregion
                base.OnModelCreating(modelBuilder);
            }
        }
    
    
        #endregion
        public class PersonMap : IEntityTypeConfiguration<Person>
        {
            public void Configure(EntityTypeBuilder<Person> builder)
            {
                builder.ToTable(nameof(Person));
                builder.HasKey(o => o.Id);
                builder.Property(o => o.Name);
                builder.Property(o => o.IdCardId);
            }
        }
        public class IdCardMap : IEntityTypeConfiguration<IdCard>
        {
            public void Configure(EntityTypeBuilder<IdCard> builder)
            {
                builder.ToTable(nameof(IdCard));
                builder.HasKey(o => o.Id);
                //builder.Property(o => o.Name);//字段Name的类型默认是nvarchar(MAX)
                builder.Property(o => o.Name).HasColumnType("varchar(20)");
                builder.HasOne(o => o.Person).WithOne(o => o.IdCard).HasForeignKey<IdCard>(o => o.PersonId);
            }
        }
    
        public class ProductMap : IEntityTypeConfiguration<Product>
        {
            public void Configure(EntityTypeBuilder<Product> builder)
            {
                builder.ToTable(nameof(Product));
                builder.HasKey(o => o.Id);
                builder.Property(o => o.ProductName).HasColumnType("varchar(50)");
                builder.HasMany(o => o.Categories).WithOne(o => o.Product);
            }
        }
        public class CategoryMap : IEntityTypeConfiguration<Category>
        {
            public void Configure(EntityTypeBuilder<Category> builder)
            {
                builder.ToTable(nameof(Category));
                builder.HasKey(o => o.Id);
                builder.Property(o => o.CategoryName).HasColumnType("varchar(30)");
                //builder.HasOne(o => o.Product).WithMany(o => o.Categories).HasForeignKey(o => o.ProductId);
            }
        }
    
        public class StudentMap : IEntityTypeConfiguration<Student>
        {
            public void Configure(EntityTypeBuilder<Student> builder)
            {
                builder.ToTable(nameof(Student));
                builder.HasKey(o => o.Id);
                builder.Property(o => o.StudentName).HasColumnType("varchar(30)");
                //builder.HasMany(o => o.StudentTeachers).WithOne(o => o.Student); //这里写这一句和在StudentTeacherMap对应关系一样的
            }
        }
    
        public class TeacherMap : IEntityTypeConfiguration<Teacher>
        {
            public void Configure(EntityTypeBuilder<Teacher> builder)
            {
                builder.ToTable(nameof(Teacher));
                builder.HasKey(o => o.Id);
                builder.Property(o => o.TeacherName).HasColumnType("varchar(33)");
                //builder.HasMany(o => o.StudentTeachers).WithOne(o => o.Teacher);//这里写这一句和在StudentTeacherMap对应关系一样的
            }
        }
    
        public class StudentTeacherMap : IEntityTypeConfiguration<StudentTeacher>
        {
            public void Configure(EntityTypeBuilder<StudentTeacher> builder)
            {
                builder.ToTable(nameof(StudentTeacher));
                builder.HasKey(a => new { a.StudentId, a.TeacherId });
                builder.HasOne(a => a.Student).WithMany(a => a.StudentTeachers).HasForeignKey(a => a.StudentId);
                builder.HasOne(a => a.Teacher).WithMany(a => a.StudentTeachers).HasForeignKey(a => a.TeacherId);
            }
        }
    
        #region EntityFrameworkCore 实体类
    
        #region 一对一
    
        public class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int IdCardId { get; set; }
            public IdCard IdCard { get; set; }
        }
    
        public class IdCard
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int PersonId { get; set; }
            public Person Person { get; set; }
        }
        #endregion
    
        #region 一对多
        public class Product
        {
            public int Id { get; set; }
            public string ProductName { get; set; }
            public IList<Category> Categories { get; set; }
        }
        public class Category
        {
            public int Id { get; set; }
            public string CategoryName { get; set; }
            public int ProductId { get; set; }
            public Product Product { get; set; }
        }
        #endregion
    
        #region  多对多
        public class Student
        {
            public int Id { get; set; }
            public string StudentName { get; set; }
            public IList<StudentTeacher> StudentTeachers { get; set; }
        }
        public class Teacher
        {
            public int Id { get; set; }
            public string TeacherName { get; set; }
            public IList<StudentTeacher> StudentTeachers { get; set; }
        }
    
        public class StudentTeacher
        {
            public int StudentId { get; set; }
            public Student Student { get; set; }
            public int TeacherId { get; set; }
            public Teacher Teacher { get; set; }
        }
        #endregion
        #endregion
    }

    注意:上述测试程序,需要配合数据库的使用,也就是说要先安装sqlserver或者mysql数据库,才可使用上述代码。

  • 相关阅读:
    1.python的一些规范
    linux 命令总结
    【背包专题】D
    【算法入门竞赛经典】【7.2枚举排列】
    【练习赛补题】问题 E: 花生采摘 【模拟】
    【背包专题】B
    【背包专题】A
    【ACM对拍程序~】
    【背包专题】E
    河南省第七届大学生程序设计竞赛 问题 A: 物资调度【简单dfs】
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/12582707.html
Copyright © 2011-2022 走看看