田敏
返回博客列表
ASP.NET Core

EFCore两种常见的开发模式

田敏
2024-12-193 分钟阅读
.NETC#Backend

在使用 Entity Framework Core 时,有两种常见的开发模式:Code FirstDatabase First。其中,Database First(简称 DB First)用于从现有数据库生成模型和上下文类。它适用于已经存在的数据库,并且你希望基于该数据库生成实体模型而不是手动编写实体类。

下面是 DB First 的使用步骤及示例:

1. 安装必要的 NuGet 包

首先,需要安装一些必要的 NuGet 包,确保你可以通过 EF Core 访问数据库并生成实体模型。

使用 .NET CLI 安装:

dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Pomelo.EntityFrameworkCore.MySql -- 如果使用 MySQL
dotnet add package Microsoft.EntityFrameworkCore.SqlServer -- 如果使用 SQL Server

你可以根据具体的数据库类型选择合适的 EF Core 提供程序。例如,如果你使用的是 SQL Server,则安装 Microsoft.EntityFrameworkCore.SqlServer,如果使用 MySQL,则安装 Pomelo.EntityFrameworkCore.MySql

2. 使用 Scaffold-DbContext 生成模型

使用 Scaffold-DbContext 命令从现有数据库生成实体类和 DbContext 类。具体的语法如下:

dotnet ef dbcontext scaffold "YourConnectionString" Microsoft.EntityFrameworkCore.SqlServer -o Models
  • "YourConnectionString":替换为你的数据库连接字符串。
  • Microsoft.EntityFrameworkCore.SqlServer:替换为你使用的数据库提供程序,如 Pomelo.EntityFrameworkCore.MySql 对于 MySQL。
  • -o Models:指定生成的实体类和上下文类的输出目录。

3. 示例:使用 SQL Server

假设你要从 SQL Server 数据库中生成实体模型。以下是完整的步骤:

连接字符串:

"Server=localhost;Database=MyDatabase;User Id=myuser;Password=mypassword;"

生成实体模型:

dotnet ef dbcontext scaffold "Server=localhost;Database=MyDatabase;User Id=myuser;Password=mypassword;" Microsoft.EntityFrameworkCore.SqlServer -o Models

此命令会从数据库中读取架构信息并生成相应的实体类和 DbContext 类。生成的类会放在 Models 文件夹下。

4. 生成的代码结构

运行 Scaffold-DbContext 命令后,会在指定的目录中生成实体模型和上下文类。下面是它们的基本结构:

DbContext 类:

DbContext 是数据库上下文类,它管理实体模型与数据库的交互。

public partial class MyDatabaseContext : DbContext
{
    public MyDatabaseContext()
    {
    }

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

    public virtual DbSet<User> Users { get; set; }
    public virtual DbSet<Course> Courses { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("Server=localhost;Database=MyDatabase;User Id=myuser;Password=mypassword;");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.Name).HasMaxLength(100);
        });

        modelBuilder.Entity<Course>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.CourseName).HasMaxLength(100);
        });
    }
}

实体类:

根据数据库中的表,EF Core 会生成对应的实体类。

public partial class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CourseId { get; set; }

    public virtual Course Course { get; set; }
}

public partial class Course
{
    public int Id { get; set; }
    public string CourseName { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

5. 使用生成的 DbContext 进行数据库操作

生成代码后,可以直接通过 DbContext 类进行数据库操作。以下是如何使用 MyDatabaseContext 来查询数据的示例:

using System;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        using (var context = new MyDatabaseContext())
        {
            var users = context.Users
                               .Where(u => u.Name.Contains("Alice"))
                               .ToList();

            foreach (var user in users)
            {
                Console.WriteLine($"User: {user.Name}, Course: {user.Course.CourseName}");
            }
        }
    }
}

6. 重新生成模型

如果数据库架构发生了变化,例如添加了新的表或更改了现有表结构,您可以再次运行 Scaffold-DbContext 命令来重新生成模型。使用 --force 选项来覆盖现有的模型类。

dotnet ef dbcontext scaffold "YourConnectionString" Microsoft.EntityFrameworkCore.SqlServer -o Models --force

7. 迁移和数据库更新

如果你希望通过迁移来管理数据库结构更新,可以使用 EF Core 的迁移功能。在使用 DB First 模式时,通常需要手动管理数据库架构变更。你可以通过以下命令为模型添加迁移并更新数据库:

dotnet ef migrations add MyNewMigration
dotnet ef database update

总结

  1. DB First 是在 EF Core 中根据已有数据库生成模型和上下文类的方式,适用于已有数据库的项目。
  2. 通过使用 Scaffold-DbContext 命令,EF Core 会根据数据库架构生成实体类和 DbContext 类。
  3. 你可以使用生成的 DbContext 类直接进行数据库的 CRUD 操作。
  4. 当数据库架构发生变更时,可以重新运行 Scaffold-DbContext 命令来更新模型,或使用 EF Core 迁移功能管理数据库的更新。

Code First 是 Entity Framework Core(EF Core)的一种开发方式,它允许开发者通过编写实体类代码来定义数据库结构,而不是从现有的数据库生成实体类。在这种方式下,EF Core 根据你定义的实体类自动生成数据库,并通过迁移功能管理数据库架构的变更。

Code First 使用步骤

  1. 创建实体类
  2. 配置 DbContext
  3. 使用迁移管理数据库

1. 创建实体类

Code First 的核心是通过 C# 类来定义数据库表。每个实体类通常对应数据库中的一张表,每个类的属性对应表中的列。

示例:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public int UserId { get; set; }
    
    // 定义外键关系
    public User User { get; set; }
}

在上面的例子中,UserPost 类将映射到数据库中的 UsersPosts 表,类中的属性映射到表中的列。

2. 配置 DbContext

DbContext 是用于与数据库交互的核心类,继承自 Microsoft.EntityFrameworkCore.DbContext。在 DbContext 中,开发者需要定义实体集 (DbSet<TEntity>) 来映射到数据库中的表。

示例:

public class ApplicationDbContext : DbContext
{
    // 定义表的映射
    public DbSet<User> Users { get; set; }
    public DbSet<Post> Posts { get; set; }

    // 配置连接字符串
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 这里使用 SQL Server 作为例子
        optionsBuilder.UseSqlServer("Server=localhost;Database=MyApp;User Id=sa;Password=yourpassword;");
    }
}

3. 使用迁移管理数据库

EF Core 的迁移功能允许开发者将实体类中的变更应用到数据库中。迁移可以追踪每次实体类的修改,并生成 SQL 代码以更新数据库结构。

步骤:

  1. 安装必要的 NuGet 包

确保项目中安装了以下 NuGet 包:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Tools
  1. 添加初始迁移

通过以下命令创建初始迁移,这会为数据库生成对应的 SQL 结构。

dotnet ef migrations add InitialCreate

InitialCreate 是迁移的名称。这个命令会在项目中创建一个 Migrations 文件夹,其中包含生成的迁移代码。

  1. 更新数据库

运行以下命令,将迁移应用到数据库:

dotnet ef database update

此命令会根据迁移文件生成并执行 SQL 语句,将数据库结构与代码中的实体类保持同步。

4. CRUD 操作

数据库创建完毕后,你可以使用 DbContext 进行基本的 CRUD 操作。

示例:插入和查询数据

using (var context = new ApplicationDbContext())
{
    // 添加用户
    var user = new User { Name = "Alice", Email = "alice@example.com" };
    context.Users.Add(user);
    context.SaveChanges(); // 保存变更到数据库

    // 查询用户
    var users = context.Users.ToList();
    foreach (var u in users)
    {
        Console.WriteLine($"User: {u.Name}, Email: {u.Email}");
    }
}

示例:更新数据

using (var context = new ApplicationDbContext())
{
    var user = context.Users.FirstOrDefault(u => u.Name == "Alice");
    if (user != null)
    {
        user.Email = "newalice@example.com";
        context.SaveChanges(); // 保存变更
    }
}

示例:删除数据

using (var context = new ApplicationDbContext())
{
    var user = context.Users.FirstOrDefault(u => u.Name == "Alice");
    if (user != null)
    {
        context.Users.Remove(user);
        context.SaveChanges(); // 保存变更
    }
}

5. 迁移和更新

如果需要对实体类进行修改(例如添加新字段或更改表结构),可以通过以下方式管理数据库更新:

  1. 修改实体类 修改实体类,例如在 User 类中添加新的属性:

    public string PhoneNumber { get; set; }
    
  2. 添加迁移 为新的修改创建一个迁移:

    dotnet ef migrations add AddPhoneNumberToUser
    
  3. 更新数据库 将新迁移应用到数据库:

    dotnet ef database update
    

总结

  1. Code First 模式允许开发者通过编写 C# 实体类定义数据库结构。
  2. DbContext 类用于管理数据库操作,开发者需要在该类中配置数据库连接和实体集。
  3. 迁移 是 Code First 的核心功能,用于跟踪代码中的数据库架构变更,并将这些变更应用到实际的数据库。
  4. 通过简单的 CRUD 操作,开发者可以轻松管理数据库中的数据。

这种方式非常适合从头开始定义数据库结构,并且在开发过程中随着需求的变更灵活地更新数据库。

版权协议:MIT返回列表