【EF Core】两种使用模式(Code First、Database First)

文章目录

      • [Code First](#Code First)
      • [Database First](#Database First)
      • [Code First 示例](#Code First 示例)
      • [Database First 示例](#Database First 示例)
        • [1. 使用Scaffold-DbContext命令生成代码(通常在Package Manager Console中执行)](#1. 使用Scaffold-DbContext命令生成代码(通常在Package Manager Console中执行))
        • [2. 生成的代码类似于Code First中的实体类和DbContext,但它们是基于现有数据库的。](#2. 生成的代码类似于Code First中的实体类和DbContext,但它们是基于现有数据库的。)
        • [3. 使用生成的DbContext操作数据库](#3. 使用生成的DbContext操作数据库)

Entity Framework Core (EF Core) 是 Microsoft 提供的一个对象关系映射器 (ORM),它允许开发者使用 .NET 对象来处理数据库。EF Core 提供了几种使用模式,帮助开发者根据项目需求高效地管理数据库和对象之间的关系。以下是 EF Core 的主要使用模式:

Code First

Code First 是 EF Core 中最常用的模式。在这种模式下,开发者首先定义 C# 类(通常称为实体或模型),然后 EF Core 根据这些类生成数据库结构。Code First 允许开发者完全控制数据库结构,因为它基于代码中的类和配置来创建数据库。

使用 Code First 的好处包括:

  • 完全的数据库控制
  • 可以通过迁移(Migrations)轻松地进行版本控制
  • 支持测试驱动的开发

要启用 Code First,你需要定义实体类,配置 DbContext,并可能还需要配置一些额外的映射或约定。

Database First

Database First 允许开发者从现有的数据库开始,并使用 EF Core 反向工程工具(如 Scaffold-DbContext)来生成 C# 实体类和 DbContext。这样,开发者就可以使用 EF Core 的功能来查询、更新和删除数据库中的数据,而无需手动编写 SQL 代码。

使用 Database First 的好处包括:

  • 可以基于现有数据库进行开发
  • 快速生成 C# 实体类和 DbContext
  • 仍然可以利用 EF Core 的所有功能

要使用 Database First,你需要先有一个数据库,并使用 EF Core 的反向工程工具来生成代码。

在选择使用哪种模式时,你应该考虑项目的需求、开发者的技能和偏好以及项目的长期规划。对于大多数新项目,Code First 通常是一个很好的选择,因为它提供了最大的灵活性和控制力。然而,如果你正在与现有的数据库进行交互,或者你的团队更习惯于使用图形化工具来管理数据模型,那么 Database First 可能更适合你。

Model First 曾经是 EF(非 Core)版本中的一个特性,但在 EF Core 中,这个模式并不直接支持。在 ModelFirst 模式下,开发者使用图形化工具(如 Entity Framework Designer)来创建EDMX(实体数据模型)文件,这个文件定义了数据模型和映射。然后,EF 会根据这个模型生成数据库结构。由于 EF Core 不直接支持 Model First,如果你想要使用类似的功能,你可能需要手动创建 EDMX文件(这通常不推荐,因为它与 EF Core 不兼容),或者使用 Code First 并依赖第三方工具来生成和维护图形化模型。

Code First 示例

安装 Entity Framework Core

"工具">"NuGet 包管理器">"包管理器控制台"。

运行以下命令:

bash 复制代码
Install-Package Microsoft.EntityFrameworkCore.Sqlite

提示:还可以通过右键单击项目并选择"管理 NuGet 程序包"来安装包

创建模型

右键单击项目,然后选择"添加">"类"

输入"Model.cs"作为名称,然后单击"添加"

将此文件的内容替换为以下代码

csharp 复制代码
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;

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

    public string DbPath { get; }

    public BloggingContext()
    {
        var folder = Environment.SpecialFolder.LocalApplicationData;
        var path = Environment.GetFolderPath(folder);
        DbPath = System.IO.Path.Join(path, "blogging.db");
    }

    // The following configures EF to create a Sqlite database file in the
    // special "local" folder for your platform.
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite($"Data Source={DbPath}");
}

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

    public List<Post> Posts { get; } = 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; }
}

EF Core 还可以从现有数据库对模型进行反向工程。

提示:为清楚起见,有意简化了此应用程序。 连接字符串不应存储在生产应用程序的代码中。 可能还需要将每个 C# 类拆分为其自己的文件。

创建数据库

在"包管理器控制台(PMC)"中,运行以下命令

bash 复制代码
Install-Package Microsoft.EntityFrameworkCore.Tools
Add-Migration InitialCreate
Update-Database

这会安装 EF Core 的 PMC 工具。 Add-Migration 命令为迁移搭建基架,以便为模型创建一组初始表。 Update-Database 命令创建数据库并向其应用新的迁移。

创建、读取、更新和删除

打开 Program.cs 并将内容替换为以下代码:

csharp 复制代码
using System;
using System.Linq;

using var db = new BloggingContext();

// Note: This sample requires the database to be created before running.
Console.WriteLine($"Database path: {db.DbPath}.");

// Create
Console.WriteLine("Inserting a new blog");
db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
db.SaveChanges();

// Read
Console.WriteLine("Querying for a blog");
var blog = db.Blogs
    .OrderBy(b => b.BlogId)
    .First();

// Update
Console.WriteLine("Updating the blog and adding a post");
blog.Url = "https://devblogs.microsoft.com/dotnet";
blog.Posts.Add(
    new Post { Title = "Hello World", Content = "I wrote an app using EF Core!" });
db.SaveChanges();

// Delete
Console.WriteLine("Delete the blog");
db.Remove(blog);
db.SaveChanges();

Database First 示例

在Database First模式中,我们从现有的数据库开始,并使用EF Core的反向工程工具(如Scaffold-DbContext)来生成C#实体类和DbContext。

1. 使用Scaffold-DbContext命令生成代码(通常在Package Manager Console中执行)
shell 复制代码
Scaffold-DbContext "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context BloggingContext -Tables Blogs,Posts

这条命令会根据指定的数据库连接字符串、数据库提供程序(在这个例子中是SqlServer)、输出目录、DbContext名称以及要包含的表来生成代码。

2. 生成的代码类似于Code First中的实体类和DbContext,但它们是基于现有数据库的。

生成的代码可能类似于上面的Code First示例,但细节(如属性名、数据类型、关系等)将完全基于数据库的结构。

3. 使用生成的DbContext操作数据库

一旦代码被生成,你就可以像使用Code First模式一样使用这些实体类和DbContext来操作数据库了。

请注意,由于Model First在EF Core中并不直接支持,所以没有直接的代码示例。如果你需要类似的功能,你可能需要手动创建EDMX文件(但这通常不推荐,因为它与EF Core不兼容),或者使用Code First模式并依赖第三方工具来生成和维护图形化模型。

相关推荐
远歌已逝几秒前
维护在线重做日志(二)
数据库·oracle
qq_433099401 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz1 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺3 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i5 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl5 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502775 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空5 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
聂 可 以7 小时前
Windows环境安装MongoDB
数据库·mongodb