个人笔记:ORM数据库框架EFCore使用示例,运行通过,附源码

Entity Framework(EF)是一个强大的对象关系映射(ORM)框架,它使 .NET 开发者能够以更简洁的方式与数据库进行交互。下面将展示如何使用 Entity Framework Core(EF Core)在 C# 中执行基本操作,包括创建表、插入数据、删除数据、更改数据和查询数据的示例。

0.新建项目

使用VS2022,选择C# 命令行项目。框架选.NET8.
image
image

建好后项目如下:
image

最后,打开程序包管理控制台。为下一步做准备。
image

1. 设置环境

1.1. 添加 NuGet 包

首先,在项目中安装 Entity Framework Core 和 SQLite(或者选择其他数据库提供程序,例如 SQL Server)相关的 NuGet 包。您可以使用以下命令在包管理控制台中安装:

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Sqlite
Install-Package Microsoft.EntityFrameworkCore.Tools

1.2. 创建模型类

新建文件sqliteEF,然后创建一个实体类,表示要映射到数据库的表。以下是一个示例 Book 类:

public class Book
{
    public int BookId { get; set; }    // 主键
    public string Title { get; set; }   // 书名
    public int PublicationYear { get; set; } // 出版年份
}

2. 创建上下文类

创建一个 DbContext 类,以便 EF Core 能够与数据库进行交互。

using Microsoft.EntityFrameworkCore;

public class BookContext : DbContext
{
    public DbSet<Book> Books { get; set; } // 表映射

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 配置连接字符串
        _ = optionsBuilder.UseSqlite($"Data Source={Path.Combine(AppContext.BaseDirectory, "books.db")}");
	// 这里路径不能用相对路径,例如:"books.db"。会有update命令和程序路径不一致的问题。
    }
}

3. 创建数据库和表

可以使用迁移功能创建数据库和表。

3.1. 启用迁移

在包管理控制台中运行以下命令以启用迁移:

Add-Migration InitialCreate

运行命令后会多一个文件夹。
image

3.2. 更新数据库

运行以下命令更新数据库,创建表:

Update-Database

Update-Database -Verbose 可以获取更多信息,便于调试

4. 插入数据

创建一个方法,将数据插入数据库:

public void AddBook(string title, int year)
{
    using (var context = new BookContext())
    {
        var book = new Book { Title = title, PublicationYear = year };
        context.Books.Add(book);
        context.SaveChanges();
    }
}

5. 查询数据

查询数据库中的所有书籍:

public List<Book> GetAllBooks()
{
    using (var context = new BookContext())
    {
        return context.Books.ToList();
    }
}

6. 更新数据

更新书籍信息的示例:

public void UpdateBook(int bookId, string newTitle, int newYear)
{
    using (var context = new BookContext())
    {
        var book = context.Books.Find(bookId);
        if (book != null)
        {
            book.Title = newTitle;
            book.PublicationYear = newYear;
            context.SaveChanges();
        }
    }
}

7. 删除数据

通过书籍 ID 删除书籍的示例:

public void DeleteBook(int bookId)
{
    using (var context = new BookContext())
    {
        var book = context.Books.Find(bookId);
        if (book != null)
        {
            context.Books.Remove(book);
            context.SaveChanges();
        }
    }
}

8. 完整示例

Program.cs 文件内容:

// See https://aka.ms/new-console-template for more information
using ConsoleApp3;

Console.WriteLine("Hello, World!");

SqliteEF sqlite = new();

// 添加书籍  
sqlite.AddBook("C# Programming", 2021);
sqlite.AddBook("Entity Framework Core", 2020);

// 查询所有书籍  
List<Book> books = sqlite.GetAllBooks();
foreach (Book book in books)
{
    Console.WriteLine($"{book.BookId}: {book.Title} - {book.PublicationYear}");
}

// 更新书籍
sqlite.UpdateBook(1, "Advanced C# Programming", 2022);

// 删除书籍
sqlite.DeleteBook(2);

// 重新查询所有书籍
Console.WriteLine("After updates、del:");
books = sqlite.GetAllBooks();
foreach (Book book in books)
{
    Console.WriteLine($"{book.BookId}: {book.Title} - {book.PublicationYear}");
}

sqlieEF.cs 内容:

using Microsoft.EntityFrameworkCore;

namespace ConsoleApp3
{
    public class Book
    {
        public int BookId { get; set; }    // 主键  
        public required string Title { get; set; }   // 书名  
        public int PublicationYear { get; set; } // 出版年份  
    }

    public class BookContext : DbContext
    {
        public DbSet<Book> Books { get; set; } // 表映射  

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // 配置连接字符串
            _ = optionsBuilder.UseSqlite($"Data Source={Path.Combine(AppContext.BaseDirectory, "books.db")}");
            // 这里路径不能用相对路径,例如:"books.db"。会有update命令和程序路径不一致的问题。
        }
    }

    public class SqliteEF
    {
        public void AddBook(string title, int year)
        {
            using BookContext context = new();
            Book book = new() { Title = title, PublicationYear = year };
            _ = context.Books.Add(book);
            _ = context.SaveChanges();
        }
        public List<Book> GetAllBooks()
        {
            using BookContext context = new();
            return context.Books.ToList();
        }
        public void UpdateBook(int bookId, string newTitle, int newYear)
        {
            using BookContext context = new();
            Book? book = context.Books.Find(bookId);
            if (book != null)
            {
                book.Title = newTitle;
                book.PublicationYear = newYear;
                _ = context.SaveChanges();
            }
        }

        public void DeleteBook(int bookId)
        {
            using BookContext context = new();
            Book? book = context.Books.Find(bookId);
            if (book != null)
            {
                _ = context.Books.Remove(book);
                _ = context.SaveChanges();
            }
        }
    }
}

运行结果:
image

总结

  • 创建 DbContext: 具有 DbSet 属性用于映射到数据库表。
  • 使用迁移创建表: 通过 EF Core 的迁移功能创建数据库和表。
  • CRUD 操作: 使用简单的方法实现插入、查询、更新和删除的功能。

这是个压缩包,改回zip可用。注意:需要重新运行Update-Database命令
image

posted @   tiankong007  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示