Skip to content

EF Core

EF Core 是一个轻量级、跨平台的 ORM 框架,它允许 .NET 开发人员通过面向对象的方式访问数据库,即 Code First。

EF Core 可以与各种关系型数据库进行交互,包括 SQL Server、MySQL、PostgreSQL 和 SQLite 等。

安装

安装 EF Core 要使用的 Nuget 包:

shell
Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Tools
# 使用 postgresql 数据库
Install-Package Npgsql.EntityFrameworkCore.PostgreSQL

创建数据模型

定义一个名为 Blog 的类来表示博客:

C#
public class Blog
{
    public int Id { get; set; }
    public string? Title { get; set; }
    public string? Content { get; set; }
}

Blog 类有三个属性:IdTitleContent,其中 Id 属性作为主键,EF Core 将自动为其生成一个唯一标识符。

创建实体类的配置

创建一个实现了 IEntityTypeConfiguration 接口的实体类的配置类 BlogEntityConfig,它用于配置实体类和数据库表的对应关系:

C#
public class BlogEntityConfig : IEntityTypeConfiguration<Blog>
{
    public void Configure(EntityTypeBuilder<Blog> builder)
    {
        // 配置生成表的名称
        builder.ToTable("Blog");
        // 配置字段的类型、长度、是否必须等
        builder.Property(e => e.Title).HasMaxLength(50).IsRequired();
    }
}

创建数据库上下文

在使用 EF Core 进行数据操作之前,需要先定义一个数据库上下文(DbContext),用于描述应用程序与数据库之间的映射关系。

这个上下文类需要继承自 DbContext

C#
public class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 配置数据库连接字符串
        string connectionString = "Server=127.0.0.1;Port=5432;Database=postgres;User Id=postgres;Password=postgres;";
        optionsBuilder.UseNpgsql(connectionString);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
    }
}

我们定义了一个名为 BloggingContext 的数据库上下文,并且包含了一个 DbSet<Blog> 属性来表示博客的集合。

另外,在 OnConfiguring 方法中,我们指定了数据库的连接字符串,以便 EF Core 可以正确连接到数据库。

创建数据库

在配置好数据库上下文之后,就可以在命令行工具中执行以下命令:

shell
# 数据库迁移
PM> Add-Migration InitBlogTable

PM> Update-database

数据操作

在 EF Core 中,我们使用 BlogEntityContext 创建了一个数据库上下文对象,在增删改查的时候,就需要通过它和数据库进行操作。

新增数据

C#
[HttpPost]
[Route("AddBlog")]
public async Task AddBlog([FromBody] List<Blog> blogs)
{
    using BlogContext ctx = new BlogContext();

    if (blogs != null && blogs.Count > 0)
    {
        foreach (Blog blog in blogs)
        {
            await ctx.Blogs.AddAsync(blog);
        }
    }
    // 提交事务,保存到数据库
    await ctx.SaveChangesAsync();
}

查询数据

C#
[HttpGet]
[Route("GetBlog")]
public Blog GetBlog([FromQuery] int Id)
{
    using BlogContext ctx = new BlogContext();

    var res = ctx.Blogs.Where(d => d.Id == Id);
    foreach (Blog item in res)
    {
        return item;
    }
    return new Blog();
}

更新数据

C#
[HttpPut]
[Route("UpdateBlog")]
public async Task UpdateBlog([FromQuery] int Id)
{
    using BlogContext ctx = new BlogContext();

    Blog res = ctx.Blogs.Single(d => d.Id == Id);
    res.Title = "赤壁赋";
    res.Content = "壬戌之秋,七月既望。";
    await ctx.SaveChangesAsync();
}

删除数据

C#
[HttpDelete]
[Route("DeleteBlog")]
public async Task DeleteBlog([FromQuery] int Id)
{
    using BlogContext ctx = new BlogContext();
  
    Blog res = ctx.Blogs.Single(d => d.Id == Id);
    ctx.Blogs.Remove(res);
    await ctx.SaveChangesAsync();
}

Released under the MIT License.