EF Core配置及使用
Entity Framework Core是微软官方的ORM框架。
ORM:Object Relational Mapping。让开发者用对象操作的形式操作关系数据库。
EF Core是对于底层ADO.NET Core的封装,因此ADO.NET Core支持的数据库不一定被EF Core支持。
代码创建数据库Code First
建实体类,建DbContext,生成数据库
建实体类:Book.cs
public class Book
{
public long Id { get; set; }//主键
public string Title { get; set; }//标题
public DateTime PubTime { get; set; }//发布日期
public double Price { get; set; }//单价
public string AuthorName { get; set; }//作者
}
NuGet安装:Install-Package Microsoft.EntityFrameworkCore.SqlServer
创建实体配置类BookConfig.cs
创建实现了IEntityTypeConfiguration接口的实体配置类,配置实体类和数据库表的对应关系。
class BookConfig : IEntityTypeConfiguration<Book>
{
public void Configure(EntityTypeBuilder<Book> builder)
{
//将实体类Book映射到的数据库表名为T_Books
builder.ToTable("T_Books");
//自定义表结构
builder.Property(b=>b.Title).HasMaxLength(50).IsRequired();
builder.Property(b=>b.AuthorName).HasMaxLength(20).IsRequired();
}
}
创建继承DbContext的类MyDbContext
class MyDbContext:DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Person> Persons { get; set; }
//配置数据库连接
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer("Server=.;Database=demo;Trusted_Connection=true;MultipleActiveResultSets=true;TrustServerCertificate=true;");
}
//配置实体模型
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//允许你在模型被映射到数据库之前对其进行自定义配置
base.OnModelCreating(modelBuilder);
//从当前程序集加载所有的IEntityTypeConfiguration
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
Migration数据库迁移
- 面向对象的ORM开发中,数据库不是程序员手动创建的,而是由Migration工具生成的。关系数据库只是盛放模型数据的一个媒介而已,理想状态下,程序员不用关心数据库的操作。
- 根据对象的定义变化,自动更新数据库中的表以及表结构的操作,叫做Migration(迁移)。
- 迁移可以分为多步(项目进化),也可以回滚。
- NuGet安装:Microsoft.EntityframeworkCore.Design;
Microsoft.EntityFrameworkCore.Tools,否则执行Add-Migration等命令会报错 - 在“程序包管理器控制台”中执行Add-Migration Init(init为迁移名称)
- 执行Update-Database,应用对数据库进行操作
增删查改
新增
只要操作Books属性,就可以向数据库中增加数据,但是通过C#代码修改Books中的数据只是修改了内存中的数据。对Books做修改后,需要调用DbContext的异步方法SaveChangesAsync()把修改保存到数据库。也有同步的保存方法SaveChanges(),但是用EF Core都推荐用异步方法,EF Core默认会跟踪(Track)实体类对象以及DbSet的改变。
static async Task Main(string[] args)
{
//ctx=逻辑上的数据库
using (MyDbContext ctx = new MyDbContext())
{
Book b = new Book()
{
Title = "软件工程",
PubTime = DateTime.Now,
Price = 36.8,
AuthorName = "ljy"
};
ctx.Add(b);//把d对象加入到Dogs这个逻辑上的表里面
await ctx.SaveChangesAsync();//相当于Update-Database,调用异步方法添加
}
}
查询
DbSet实现了IEnumerable<T>接口,因此可以对DbSet实施Linq操作来进行数据查询。EF Core会把Linq操作转换为SQL语句。面向对象,而不是面向数据库(SQL),大部分Linq操作都能作用于EF Core。
static async Task Main(string[] args)
{
//ctx=逻辑上的数据库
using (MyDbContext ctx = new MyDbContext())
{
//查询Books表中价格大于80的书籍名称
//相当于select * from t_books where price >80
IQueryable<Book> books = ctx.Books.Where(b => b.Price > 80);
foreach (Book book in books)
{
Console.WriteLine(book.Title);
}
}
}
修改
要对数据进行修改,首先需要把要修改的数据查询出来,然后再对查询出来的对象进行修改,然后再执行SaveChangesAsync()保存修改。
static async Task Main(string[] args)
{
using (MyDbContext ctx = new MyDbContext())
{
//相当于update t_books set AuthorName='ljy' where title='操作系统'
Book books = ctx.Books.SingleOrDefault(b => b.Title == "操作系统");
books.AuthorName = "ljy";
await ctx.SaveChangesAsync();
}
}
删除
删除也是先把要修改的数据查询出来,然后再调用DbSet或者DbContext的Remove方法把对象删除,然后再执行SaveChangesAsync()保存修改。
static async Task Main(string[] args)
{
using (MyDbContext ctx = new MyDbContext())
{
//相当于delete t_books where title='操作系统'
Book books = ctx.Books.SingleOrDefault(b => b.Title == "操作系统");
ctx.Remove(books);
await ctx.SaveChangesAsync();
}
}
EF Core7.0批量修改删除
批量修改:ExecuteUpdate()
//Linq
context.Blogs
.Where(b => b.Rating < 3)
.ExecuteUpdate(setters => setters
.SetProperty(b => b.Title, Dog)//将Title设置为Dog
.SetProperty(b => b.Rating, 0));//将Rating设置为0
//SQL
update Blogs set Blogs.Rating=0,Blogs.Title=Dog From Blogs where Blogs.Rating<3
批量删除:ExecuteDelete()
//Linq
context.Blogs.Where(b => b.Rating < 3).ExecuteDelete();
//SQL
delete from Blogs where Blogs.Rating<3