前一篇笔记中我们学习了EFCore中如何定义模型,这篇笔记我们学习如何在EFCore中实现单表数据的增删改查,有关多表关联操作将在后续章节继续介绍。
下面代码演示和如何实现数据插入。
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static void Main()
{
using (MyDbContext myDbContext = new MyDbContext())
{
Student s1 = new Student { StudentName = "Tom", Age = 18, CreateTime = DateTime.Now };
Student s2 = new Student { StudentName = "Lucy", Age = 18, CreateTime = DateTime.Now };
Student s3 = new Student { StudentName = "Bob", Age = 19, CreateTime = DateTime.Now };
Student s4 = new Student { StudentName = "Jerry", Age = 18, CreateTime = DateTime.Now };
Student s5 = new Student { StudentName = "Kate", Age = 18, CreateTime = DateTime.Now };
myDbContext.Students.Add(s1);
myDbContext.Students.Add(s2);
myDbContext.Students.Add(s3);
myDbContext.Students.Add(s4);
myDbContext.Students.Add(s5);
myDbContext.SaveChanges();
}
}
}
代码中,我们先创建了若干个Student
对象,然后调用myDbContext.Students.Add()
表示我们将进行数据插入操作,此时EFCore框架将根据我们的操作进行实体状态管理、SQL语句生成、数据验证等操作。最后我们调用myDbContext.SaveChanges()
方法将数据写入数据库中。这里要注意的是调用SaveChanges()
之前数据是还没有实际写入数据库的,写入数据库发生在SaveChanges()
方法中。
如果我们使用自增主键,我们可以在数据保存到数据库后,从数据模型中获取自动生成的主键值。
Student s1 = new Student { StudentName = "Tom", Age = 18, CreateTime = DateTime.Now };
myDbContext.Students.Add(s1);
myDbContext.SaveChanges();
Console.WriteLine(s1.StudentId);
下面例子演示了如何使用EFCore查询数据表中的所有数据。
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static void Main()
{
using (MyDbContext myDbContext = new MyDbContext())
{
foreach (Student student in myDbContext.Students)
{
Console.WriteLine("{0} {1} {2}", student.StudentId, student.StudentName, student.Age);
}
}
}
}
可以看到代码非常简单,我们直接遍历DbContext
对象中对应数据模型的DbSet
属性就行了。
下面例子演示了如何使用EFCore对数据表进行条件查询。
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static void Main()
{
using (MyDbContext myDbContext = new MyDbContext())
{
IQueryable<Student> result = from student in myDbContext.Students where student.Age == 19 select student;
foreach (Student student in result)
{
Console.WriteLine("{0} {1} {2}", student.StudentId, student.StudentName, student.Age);
}
}
}
}
上面代码查询了所有Student.Age
属性为19
的数据,返回了一个可迭代对象。如果只查询一条数据,我们可以使用FirstOrDefault()
方法,下面例子中只会返回一条数据,如果数据不存在则返回null
。
Student? result = (from student in myDbContext.Students where student.StudentId == 1 select student).FirstOrDefault();
条件查询非常简单,我们直接使用LINQ对DbContext
对象中对应数据模型的DbSet
属性进行查询操作即可,对于排序、分组等操作我们也都使用LINQ中对应的语法即可。此外,这里我们使用了LINQ的查询语法,我们也可以使用方法语法,两者是等效的,有关LINQ查询的内容可以参考C#语言基础相关章节。
我们知道LINQ本身支持分页查询,EFCore的查询操作也是基于LINQ的,我们直接使用Skip()
和Take()
方法对查询进行分页即可。
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static void Main()
{
using (MyDbContext myDbContext = new MyDbContext())
{
IQueryable<Student> resultAll =
from student in myDbContext.Students where student.ClassRoomId == 1L select student;
IQueryable<Student> result = resultAll.Skip(5).Take(5);
Console.WriteLine($"共{resultAll.LongCount()}条记录");
foreach (Student student in result)
{
Console.WriteLine($"{student.StudentName}");
}
}
}
}
下面例子中我们对数据表中的数据进行了修改。
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static void Main()
{
using (MyDbContext myDbContext = new MyDbContext())
{
Student? result = (from student in myDbContext.Students where student.StudentId == 1 select student).FirstOrDefault();
if (result != null)
{
result.StudentName = "LiLei";
}
myDbContext.SaveChanges();
}
}
}
代码中,我们首先使用LINQ将StudentId
属性等于1
数据查询出来,然后修改其中的属性,最后调用DbContext.SaveChanges()
保存修改即可。
下面例子中我们对数据表中的数据进行了删除。
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static void Main()
{
using (MyDbContext myDbContext = new MyDbContext())
{
Student? result = (from student in myDbContext.Students where student.StudentId == 1 select student).FirstOrDefault();
if (result != null)
{
myDbContext.Remove(result);
}
myDbContext.SaveChanges();
}
}
}
类似修改的写法,代码中我们首先使用LINQ表达式将数据查询出来,然后调用DbContext.Remove()
指示EFCore框架将数据删除,最后调用DbContext.SaveChanges()
方法保存修改。
前面我们演示的增删改查例子使用的都是同步操作方法,EFCore也支持异步数据库操作。
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static async Task Main()
{
await using (MyDbContext myDbContext = new MyDbContext())
{
Student s = new Student { StudentName = "Obama", Age = 18, CreateTime = DateTime.Now };
myDbContext.Students.Add(s);
await myDbContext.SaveChangesAsync();
}
}
}
EFCore中调用DbContext.SaveChangesAsync()
即可实现异步操作。