EFCore常见用法

1、跟踪查询。查询到的对象可以用来修改数据库中的值

var first=db.list.First();
first.Name="已修改";
context.SaveChanges();

2、非跟踪查询。查询到的对象无法修改数据库中的值

var first=db.list.AsNoTracking().First();
first.Name="已修改";
db.SaveChanges();

3、非跟踪查询2。与上面等效,多次操作时,可以少用几个AsNoTracking()方法

db.ChangeTracker.QueryTrackingBehavior=QueryTrackingBehavior.NoTracking;
var first=db.list.First();
first.Name="已修改";
db.SaveChanges();

4、非跟踪查询3。在连接字符串后面增加限定

protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite($"Data Source={DbPath}").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);

5、批量删除

//方式1
db.list.Where(x=>x.Id>30).ExecuteDelete();

6、某些方法特性

//SaveChange()可以同时处理多个操作。不明确、不批量、不知道时使用该方法
//ExecuteDelete()方法会立即执行。明确、批量、知道时使用该方法
//ExecuteUpdate ()方法会立即执行。明确、批量、知道时使用该方法

7、单个添加

db.Add(new Student(){ClassId=2,Name="赵子龙"});
db.SaveChanges();

8、多个添加

db.AddRange(new List<Student>(){
	new Student(){ClassId=2,Name="张翼德"}),
	new Student(){ClassId=2,Name="关云长"}),
});
db.SaveChanges();

9、单个修改

var stu = db.list.FirstOrDefault(x => x.Name.Equals("赵子龙"));
stu.Name= "赵云";
db.Entry(stu).State = EntityState.Modified;
int editCount = db.SaveChanges();

10、批量修改1

var stus = db.list.Where(x => x.ClassId==2);
foreach (var stu in stus)
{
	stu.Name= "赵云";
	db.Entry(stu).State = EntityState.Modified;
}
int editCount = db.SaveChanges();

11、批量修改2。与上面方法效果一致

db.list.Where(x => x.ClassId==2).ExecuteUpdate(s=>s.SetProperty(b=>b.Name,"赵云"));

12、单个删除

var stu=db.list.FirstOrDefault();
db.list.Remove(stu);
int deleteCount=db.SaveChanges();

13、批量删除

db.list.Where(x => x.ClassId==2).ExecuteDelete();

14、事务。事务允许以院子方式处理多个数据库操作。如果已提交事务,则所有曹总都会成功应用到数据库。如果已回滚事务,则所有操作都不会应用到数据库。

using var transaction = db.Database.BeginTransaction();
try
{
	//批量添加1
	db.AddRange(new List<Post>()
	{
		new Post(){ PostId=3,Title="cc" },
		new Post(){ PostId=3,Title="dd" },
	});
	db.SaveChanges();
	//批量添加2
	db.AddRange(new List<Post>()
	{
		new Post(){ PostId=3,Title="ee" },
		new Post(){ PostId=3,Title="ff" },
	});
	db.SaveChanges();
	//提交事务
	transaction.Commit();
}
catch (Exception ex)//提交事务会出现异常
{
	//回滚事务
	transaction.Rollback();
	Console.WriteLine(ex.Message);
}

15、分组和统计

//得到的group是List<匿名类>。匿名类的属性就2个ClassId 和StudentCount 
var group = db.Students
	//使用GroupBy分组,依据ClassId
	.GroupBy(s => s.ClassId).Select(g => new
	{
		//拿到ClassId,由于ClassId是分组的,因此使用Max或Min是一样的
		ClassId = g.Max(s => s.ClassId),
		//使用Count函数拿到总数
		StudentCount = g.Count()
	});

你可能感兴趣的:(数据库,c#,EFCore)