EFCore两种常见的开发模式
在使用 Entity Framework Core 时,有两种常见的开发模式:Code First 和 Database 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
总结
- DB First 是在 EF Core 中根据已有数据库生成模型和上下文类的方式,适用于已有数据库的项目。
- 通过使用
Scaffold-DbContext命令,EF Core 会根据数据库架构生成实体类和DbContext类。 - 你可以使用生成的
DbContext类直接进行数据库的 CRUD 操作。 - 当数据库架构发生变更时,可以重新运行
Scaffold-DbContext命令来更新模型,或使用 EF Core 迁移功能管理数据库的更新。
Code First 是 Entity Framework Core(EF Core)的一种开发方式,它允许开发者通过编写实体类代码来定义数据库结构,而不是从现有的数据库生成实体类。在这种方式下,EF Core 根据你定义的实体类自动生成数据库,并通过迁移功能管理数据库架构的变更。
Code First 使用步骤
- 创建实体类
- 配置
DbContext类 - 使用迁移管理数据库
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; }
}
在上面的例子中,User 和 Post 类将映射到数据库中的 Users 和 Posts 表,类中的属性映射到表中的列。
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 代码以更新数据库结构。
步骤:
- 安装必要的 NuGet 包
确保项目中安装了以下 NuGet 包:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Tools
- 添加初始迁移
通过以下命令创建初始迁移,这会为数据库生成对应的 SQL 结构。
dotnet ef migrations add InitialCreate
InitialCreate 是迁移的名称。这个命令会在项目中创建一个 Migrations 文件夹,其中包含生成的迁移代码。
- 更新数据库
运行以下命令,将迁移应用到数据库:
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. 迁移和更新
如果需要对实体类进行修改(例如添加新字段或更改表结构),可以通过以下方式管理数据库更新:
-
修改实体类 修改实体类,例如在
User类中添加新的属性:public string PhoneNumber { get; set; } -
添加迁移 为新的修改创建一个迁移:
dotnet ef migrations add AddPhoneNumberToUser -
更新数据库 将新迁移应用到数据库:
dotnet ef database update
总结
- Code First 模式允许开发者通过编写 C# 实体类定义数据库结构。
DbContext类用于管理数据库操作,开发者需要在该类中配置数据库连接和实体集。- 迁移 是 Code First 的核心功能,用于跟踪代码中的数据库架构变更,并将这些变更应用到实际的数据库。
- 通过简单的 CRUD 操作,开发者可以轻松管理数据库中的数据。
这种方式非常适合从头开始定义数据库结构,并且在开发过程中随着需求的变更灵活地更新数据库。