初学EntityFrameworkCore教程(详细)

首先声明,该篇文章是本人自学EFCore时总结的,如有理解不到位的地方欢迎各位大佬指正!
一、CodeFirst(更常用)
步骤:
任何实现了IDisposable接口的类都需要手动释放,使用using语法也可实现
在这里插入图片描述
项目结构:
在这里插入图片描述

  1. 下载NuGet程序包:
    在这里插入图片描述
  2. 创建模型类(Models -> Book.cs)
    一个模型类对应数据库中的一张表,一个模型类实例化对象对应数据库表中的一条记录
public class Book
    {
        public int BookId { get; set; } 
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime PublieshedOn { get; set; }
        public string Publisher { get; set; }
        public decimal Price { get; set; }
        public string ImageUrl { get; set; }
    }
  1. 配置数据库上下文类
    重点两步:(1)构造函数 (2)数据库上下文类的配置OnConfiguring()方法
using Microsoft.EntityFrameworkCore;
using ConsoleApp1.Models;

namespace ConsoleApp1
{
    //数据库上下文类有点像连接数据库的一个管道
    public class AntContext:DbContext
    {
        //主要是框架在用,有时用户也能用到
        public AntContext()
        { 
        
        }

        //上下文类构造函数
        public AntContext(DbContextOptions<AntContext> options):base(options)
        {

        }

        public DbSet<Book> Books { get; set; }

        //配置数据库上下文类
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string connString = @"server=WINDOWS-EMNVTLV;database=Test;
trusted_connection=true;MultipleActiveResultSets=true";
            optionsBuilder.UseSqlServer(connString);//这里要确保安装Microsoft.EntityFrameworkCore.SqlServer
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
        	//添加数据
            modelBuilder.Entity<Book>().HasData(new List<Book>
            {
                new Book{ BookId=1,Title="Ant编程1"},
                new Book{ BookId=2,Title="Ant编程2"},
                new Book{ BookId=3,Title="Ant编程3"},
            });
        }
    }
}

OnModelCreating()方法:
按照官方的解释:在完成对派生上下文的模型的初始化后,并在该模型已锁定并用于初始化上下文之前,将调用此方法。 虽然此方法的默认实现不执行任何操作,但可在派生类中重写此方法,这样便能在锁定模型之前对其进行进一步的配置。通常,在创建派生上下文的第一个实例时仅调用此方法一次, 然后将缓存该上下文的模型,并且该模型适用于应用程序域中的上下文的所有后续实例另外在做数据库迁移生成迁移文件的时候也会调用OnModelCreating方法。通过在给定的 ModelBuidler 上设置 ModelCaching 属性可禁用此缓存,但注意这样做会大大降低性能。 通过直接使用 DbModelBuilder 和 DbContextFactory 类来提供对缓存的更多控制。
4.迁移数据库
打开命令行:工具->NuGet包管理器->程序包管理器控制台
(1)add-migration init-Mig :为任何待定的模型更改 搭建迁移脚本。
在这里插入图片描述
结果生成:
在这里插入图片描述
(2)update-database :修改到数据库
在这里插入图片描述
最终生成:
在这里插入图片描述
迁移文件中会生成一个up方法和一个down方法,up方法会对比第一次生成的snapshot进行更新,down方法进行删除。

执行这个命令如果报错:A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。)
则在连接字符串中添加Trust Server Certificate=true;
在这里插入图片描述

二、DataBaseFirst

  1. 下载NuGet程序包(和上面CodeFirst步骤1一样)
  2. 在数据库中建表
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/5dd75f6015164a48bc47ac26ea56ae80.pn
  3. 在命令行中输入命令:
    第一行是自动生成模型类model的命令,之后几行是参数注解
//Scaffold-DbContext "server=WINDOWS-EMNVTLV;database=Test;trusted_connection = true; MultipleActiveResultSets = true" Microsoft.EntityFrameworkCore.SqlServer
//-Context AntContext 上下文类名称
//-outputdir Models 模型输出目录
//-contextdir Data 上下文目录
//-Tables Address,Product 指定生成的模型
//-DataAnotations 生成数据注解
//-Force 强制覆盖

在这里插入图片描述
结果:
在这里插入图片描述
三、数据加载和CRUD操作
项目结构:
项目结构

  1. 下载NuGet程序包(和上面CodeFirst步骤1一样)
  2. 创建模型类
    Student.cs:
 using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace ConstrainsAndRelations.Models
{
    //[Table("Student02")] //设置表名为Student02
    public class Student
    {
        public bool SoftDeleted { get; set; }
        [Key] //主键
        public int StudentId { get; set; }

        [StringLength(50)] //限制字符串长度为50
        [Column("StudentName")] //列名改为StudentName
        public string Name { get; set; }
        public DateTime EnrollmentDate { get; set; }
        [NotMapped] //迁移数据库时该字段不映射到数据库,即数据库不创建该字段
        public string Image { get; set; }
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

OfficeAssignment.cs:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace ConstrainsAndRelations.Models
{
    public class OfficeAssignment
    {
        [Key]
        [ForeignKey("Instructor")]//外键
        public int InstructorId { get; set; }
        [StringLength(50)]
        public string Location { get; set; }
        public virtual Instructor Instructor { get; set; }
    }
}

Instructor.cs:

using System.ComponentModel.DataAnnotations;

namespace ConstrainsAndRelations.Models
{
    public class Instructor
    {
        [Key]
        public int InstructorId { get; set; }
        [Required] //必填字段
        [StringLength(50)]
        public string Name { get; set; }
        public DateTime HireDate { get; set; }
        public virtual ICollection<Student> Students { get; set; }
        public virtual OfficeAssignment OfficeAssignment { get; set; }
    }
}

Enrollment.cs:

using System.ComponentModel.DataAnnotations;

namespace ConstrainsAndRelations.Models
{
    public enum Grade
    { 
        A,B,C,D
    }
    public class Enrollment
    {
        [Key]
        public int EnrollmentId { get; set; }
        public Grade? Grade { get; set; }
        public int StudentId { get; set; }
        public int CourseId { get; set; }

        //导航属性
        public virtual Student Student { get; set; }
        public virtual Course Course { get; set; }
    }
}

Department.cs:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace ConstrainsAndRelations.Models
{
    public class Department
    {
        [Key]
        public int DepartmentId { get; set; }
        [StringLength(50)]
        public string Name { get; set; }
        [Column(TypeName="money")]
        public decimal Budget { get; set; }
        public DateTime StartDate { get; set; }
        [Display(Name = "Admin")] //这里将Name显示为Admin
        public int? InstructorId { get; set; }
        public virtual ICollection<Course> Courses { get; set; }
        public virtual Instructor Instructor { get; set; }
    }
}

Course.cs:

using System.ComponentModel.DataAnnotations;

namespace ConstrainsAndRelations.Models
{
    public class Course
    {
        [Key]
        public int CourseId { get; set; }
        [StringLength(50,MinimumLength =2,ErrorMessage ="最大长度为50!")]
        public string Title { get; set; }
        public virtual ICollection<Enrollment> Enrollments { get; set; }
        public virtual ICollection<Instructor> Instructors { get; set; }
        public virtual Department Department { get; set; }
    }
}

四. 项目中配置EF Core
1、配置appsetting.json
在这里插入图片描述
2、配置上下文类
在这里插入图片描述
3、配置startup.cs
在这里插入图片描述
4、使用
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Entity Framework Core实战,第二版》是一本关于Entity Framework Core的书籍。Entity Framework Core是用于.NET平台的对象关系映射(ORM)工具,它提供了一种简单、高效的方式来访问和操作数据库。 这本书第二版的主要目标是帮助读者更好地理解和使用Entity Framework Core。书中介绍了Entity Framework Core的基本概念和架构,并提供了丰富的实例和案例来演示各种用法和技巧。 书中的内容主要涵盖以下方面: 1. 数据模型的创建和映射:介绍如何使用Entity Framework Core创建数据库表和实体类之间的映射关系。涵盖了使用数据注解和Fluent API两种方式进行映射的方法。 2. 查询和过滤数据:介绍如何使用LINQ查询语言和Entity Framework Core提供的查询操作来从数据库中检索和过滤数据。 3. 数据操作和事务管理:讲解使用Entity Framework Core进行数据的增删改操作,以及如何管理和处理数据库事务。 4. 性能优化和调优:介绍如何使用各种技巧和策略来提高Entity Framework Core的性能,并减少数据库的压力。 5. 并发控制和数据缓存:探讨如何使用Entity Framework Core提供的并发控制机制来保证多线程环境下数据的一致性,并介绍了如何使用缓存机制来提高数据访问的效率。 通过学习《Entity Framework Core实战,第二版》,读者可以掌握Entity Framework Core的核心概念和用法,提高开发效率,优化数据访问性能,并了解如何处理数据库操作中的各种复杂情况。无论是初学者还是有经验的开发者,都可以从这本书中获得实用的知识和技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值