Entity Framework Core实战:.NET中的ORM使用指南

Entity Framework Core 实战:.NET 中的 ORM 使用指南

引言

大家好,欢迎来到今天的讲座!今天我们要一起探讨的是 Entity Framework Core (EF Core),这是 .NET 生态系统中最流行的 ORM(对象关系映射)工具之一。如果你是一个 .NET 开发者,或者对数据库操作感兴趣,那么 EF Core 一定会成为你开发中的得力助手。

ORM 是什么?简单来说,它是一种将对象模型与关系型数据库之间的差异进行抽象的技术。通过 ORM,你可以用面向对象的方式与数据库交互,而不需要直接编写 SQL 语句。EF Core 就是这样一个强大的工具,它让你可以专注于业务逻辑,而不是数据库的操作细节。

在接下来的时间里,我们将通过一些实际的例子和代码片段,深入浅出地讲解如何使用 EF Core 来简化你的 .NET 应用程序开发。准备好了吗?让我们开始吧!


1. 什么是 Entity Framework Core?

1.1 简介

Entity Framework Core 是微软官方提供的一个轻量级、可扩展的 ORM 框架,专为 .NET 平台设计。它允许开发者以面向对象的方式与关系型数据库(如 SQL Server、MySQL、PostgreSQL 等)进行交互。EF Core 的设计理念是“约定优于配置”,这意味着它会根据你定义的类和属性自动推断出数据库结构,减少了大量繁琐的配置工作。

1.2 为什么选择 EF Core?

  • 简洁易用:EF Core 提供了流畅的 API,使得数据库操作变得非常直观。
  • 跨平台支持:它不仅支持 Windows,还支持 Linux 和 macOS,适合现代的跨平台开发需求。
  • 高性能:尽管 EF Core 是一个高级抽象层,但它在性能上做了很多优化,能够生成高效的 SQL 查询。
  • 丰富的功能:支持 LINQ 查询、迁移、分页、事务处理等常见功能,满足各种复杂的业务需求。

2. 安装和配置 EF Core

2.1 创建项目

首先,我们需要创建一个新的 .NET Core 控制台应用程序。打开终端或命令行工具,执行以下命令:

dotnet new console -n EfCoreDemo
cd EfCoreDemo

这将创建一个名为 EfCoreDemo 的控制台应用程序。

2.2 添加 EF Core 包

接下来,我们需要添加 EF Core 的 NuGet 包。EF Core 本身并不绑定到特定的数据库提供程序,因此我们需要根据使用的数据库来选择相应的提供程序包。假设我们使用的是 SQL Server,可以执行以下命令来安装 EF Core 和 SQL Server 提供程序:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer:用于连接 SQL Server 数据库。
  • Microsoft.EntityFrameworkCore.Tools:提供了用于生成和管理数据库迁移的工具。

2.3 配置数据库连接

appsettings.json 文件中,添加数据库连接字符串。如果你没有 appsettings.json 文件,可以通过以下命令创建一个:

dotnet new appsettings

然后,在 appsettings.json 中添加如下内容:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=EfCoreDemoDb;Trusted_Connection=True;"
  }
}

接下来,在 Program.cs 中加载配置并设置数据库上下文。我们使用 IConfiguration 来读取连接字符串,并将其传递给 DbContext

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

public class Program
{
    public static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();

        var connectionString = configuration.GetConnectionString("DefaultConnection");

        using (var context = new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseSqlServer(connectionString)
            .Options))
        {
            // 这里可以执行数据库操作
        }
    }
}

3. 定义实体和上下文

3.1 创建实体类

在 EF Core 中,实体类是与数据库表相对应的类。我们可以使用 C# 类来表示数据库中的表。例如,假设我们有一个简单的博客应用,其中包含博客文章和作者信息。我们可以定义两个实体类:BlogPost

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    // 导航属性,表示一个博客可以有多个帖子
    public List<Post> Posts { get; set; } = new();
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    // 外键属性,表示每个帖子属于一个博客
    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

3.2 创建数据库上下文

数据库上下文 (DbContext) 是 EF Core 的核心类,它负责管理实体的生命周期并与数据库进行交互。我们可以通过继承 DbContext 来创建自定义的上下文类。

public class ApplicationDbContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 可以在这里配置实体之间的关系
        modelBuilder.Entity<Blog>()
            .HasMany(b => b.Posts)
            .WithOne(p => p.Blog)
            .HasForeignKey(p => p.BlogId);

        base.OnModelCreating(modelBuilder);
    }
}

4. 使用 EF Core 进行 CRUD 操作

4.1 添加数据

现在我们已经定义了实体和上下文,接下来可以开始进行 CRUD 操作了。首先,我们来看如何向数据库中添加数据。

using (var context = new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer(connectionString)
    .Options))
{
    var blog = new Blog { Url = "https://example.com" };
    context.Blogs.Add(blog);

    var post = new Post { Title = "First Post", Content = "This is my first post!" };
    post.Blog = blog;
    context.Posts.Add(post);

    context.SaveChanges();
}

SaveChanges() 方法会将所有待处理的更改提交到数据库,并返回受影响的行数。

4.2 查询数据

EF Core 支持使用 LINQ 查询语言来从数据库中检索数据。LINQ 查询会在运行时被转换为 SQL 查询,并执行在数据库中。

using (var context = new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer(connectionString)
    .Options))
{
    // 获取所有博客
    var blogs = context.Blogs.ToList();

    // 获取某个博客的所有帖子
    var posts = context.Posts.Where(p => p.Blog.Url == "https://example.com").ToList();

    foreach (var post in posts)
    {
        Console.WriteLine($"{post.Title}: {post.Content}");
    }
}

4.3 更新数据

更新数据也非常简单。我们只需要从数据库中获取要更新的实体,修改它的属性,然后调用 SaveChanges()

using (var context = new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer(connectionString)
    .Options))
{
    var post = context.Posts.First(p => p.Title == "First Post");
    post.Content = "Updated content!";
    context.SaveChanges();
}

4.4 删除数据

删除数据同样可以通过 Remove() 方法来实现。

using (var context = new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer(connectionString)
    .Options))
{
    var post = context.Posts.First(p => p.Title == "First Post");
    context.Posts.Remove(post);
    context.SaveChanges();
}

5. 数据库迁移

5.1 什么是迁移?

迁移(Migrations)是 EF Core 中用于管理数据库模式变更的功能。通过迁移,你可以在不丢失现有数据的情况下,安全地修改数据库结构。每次你对实体类或上下文进行了更改(例如添加新字段或修改现有字段),都可以创建一个新的迁移来记录这些变更。

5.2 创建和应用迁移

要创建一个新的迁移,可以使用 dotnet ef migrations add 命令。假设我们想为 Post 实体添加一个 PublishedDate 字段,首先需要修改 Post 类:

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedDate { get; set; } // 新增字段

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

然后,执行以下命令来创建迁移:

dotnet ef migrations add AddPublishedDateToPost

这将生成一个新的迁移文件,记录了对 Post 表的变更。接下来,我们可以使用 dotnet ef database update 命令将这些变更应用到数据库中:

dotnet ef database update

6. 性能优化

虽然 EF Core 提供了非常方便的 API,但在某些情况下,我们仍然需要注意性能问题。以下是一些常见的优化技巧:

6.1 使用 AsNoTracking()

默认情况下,EF Core 会对查询结果进行跟踪,以便在后续操作中检测到更改。如果你只是读取数据而不打算修改它,可以使用 AsNoTracking() 来禁用跟踪,从而提高查询性能。

var posts = context.Posts.AsNoTracking().ToList();

6.2 分页查询

当查询大量数据时,分页查询可以显著减少内存占用和网络传输时间。EF Core 提供了 Skip()Take() 方法来实现分页。

var page = 1;
var pageSize = 10;
var posts = context.Posts
    .OrderBy(p => p.PostId)
    .Skip((page - 1) * pageSize)
    .Take(pageSize)
    .ToList();

6.3 批量操作

对于批量插入、更新或删除操作,可以使用第三方库(如 EFCore.BulkExtensions)来提高性能。批量操作可以减少与数据库的往返次数,从而加快执行速度。


结语

通过今天的讲座,我们了解了如何使用 Entity Framework Core 来简化 .NET 应用程序中的数据库操作。无论是创建实体类、配置上下文,还是进行 CRUD 操作和数据库迁移,EF Core 都为我们提供了强大的工具和灵活的 API。

当然,EF Core 的功能远不止这些。随着你对它的深入了解,你会发现它在处理复杂场景时的强大之处。希望今天的讲座对你有所帮助,祝你在未来的开发中顺利使用 EF Core!

如果有任何问题,欢迎随时提问!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注