说明
1-修改表数据后,均需要通过执行 dbContext.SaveChanges() 函数来保存修改
2-XxxRange()函数实际上是单个操作的循环,并不是真正意义上的批量操作
3-ExecuteXxx()函数执行批量操作时,是实际上的批量操作。此外,区别于XxxRange(),无需将数据加载至内存(无查询操作,仅生成一条SQL)
增
单个增加:Add(),参数为实体实例
批量增加:AddRange() ,参数为可枚举类型或数组
dbContext.Books.Add(new Book { Title = "Add", AuthorName = "Add" });
Book[] bookArr =
{
new Book{ Title="AddRange_1",AuthorName = "AddRange_1"},
new Book{ Title="AddRange_2",AuthorName = "AddRange_2"},
new Book{ Title="AddRange_3",AuthorName = "AddRange_3"}
};
dbContext.Books.AddRange(bookArr);
删
单个删除:Remove(),参数为实体实例
批量删除:RemoveRange(),参数为可枚举类型或数组
EFCore7.0+时,删除(单个或批量)可通过ExecuteDelete()实现
// Remove()
dbContext.Remove(dbContext.Books.Where(e => e.AuthorName == "Add").SingleOrDefault());
// RemoveRange()
dbContext.RemoveRange(dbContext.Books.Where(e => e.AuthorName.Contains("AddRange")).ToList());
// ExecuteDelete() EFCore7.0+
dbContext.Books.Where(e => e.AuthorName.Contains("AddRange")).ExecuteDelete();
改
方式:先查询(通过对DbSet执行Linq),再修改
// 先查询, 再修改
Book? book = dbContext.Books.Where(e => e.AuthorName == "Add").SingleOrDefault();
if (book != null)
{
book.Price += 10;
}
EFCore7.0+时,修改(单个或批量)可通过ExecuteUpdate()实现(第一个参数为被修改的表字段,第二个参数为修改值)
// ExecuteUpdate() EFCore7.0 +
dbContext.Books.Where(e => e.AuthorName == "Add").ExecuteUpdate(setter => setter.SetProperty(e => e.Price, e => e.Price + 10));
此外,还可通过Update()/UpdateRange()实现单个或批量更新
Update()/UpdateRange()会将实例标记为已更改状态,通过SaveChanges()函数将实例更新至DB(实例可以是通过查询获得的,也可以是新建的)
Book book = new() { Id = 1, Title="Test", AuthorName = "123", Price=10 };
dbContext.Books.Update(book);
查
方式:通过对DbSet执行Linq
IQueryable<Book> books = dbContext.Books.Where(e => e.Price > 0);
if (books.Count()!=0)
{
foreach (var item in books)
{
Console.WriteLine(item.Title);
}
}
string sqlString = books.ToQueryString(); // 获取查询语句的SQL代码
注:可通过IQueryable<T>的扩展函数ToQueryString()来获取查询语句的SQL代码