增删改查

前一篇笔记中我们学习了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()即可实现异步操作。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap