首先声明,该篇文章是本人自学EFCore时总结的,如有理解不到位的地方欢迎各位大佬指正!
一、CodeFirst(更常用)
步骤:
任何实现了IDisposable接口的类都需要手动释放,使用using语法也可实现
项目结构:
- 下载NuGet程序包:
- 创建模型类(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)构造函数 (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
- 下载NuGet程序包(和上面CodeFirst步骤1一样)
- 在数据库中建表
- 在命令行中输入命令:
第一行是自动生成模型类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操作
项目结构:
- 下载NuGet程序包(和上面CodeFirst步骤1一样)
- 创建模型类
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、使用