当前位置: 首页 > article >正文

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

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

      • 0.新建项目
      • 1. 设置环境
        • 1.1. 添加 NuGet 包
        • 1.2. 创建模型类
      • 2. 创建上下文类
      • 3. 创建数据库和表
        • 3.1. 启用迁移
        • 3.2. 更新数据库
      • 4. 插入数据
      • 5. 查询数据
      • 6. 更新数据
      • 7. 删除数据
      • 8. 完整示例
      • 总结

0.新建项目

选择C# 命令行项目。框架选.NET8.
在这里插入图片描述
在这里插入图片描述

建好后项目如下:
在这里插入图片描述
最后,打开程序包管理控制台。为下一步做准备。
在这里插入图片描述

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

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

3.2. 更新数据库

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

Update-Database

注意:date-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!");

var sqlite = new SqliteEF();

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

// 查询所有书籍  
var books = sqlite.GetAllBooks();
foreach (var 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 (var book in books)
{
    Console.WriteLine($"{book.BookId}: {book.Title} - {book.PublicationYear}");
}
//==========
//========SqliteEF.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();
	        }
	    }    
	}
}

总结

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

http://www.kler.cn/a/451109.html

相关文章:

  • IIC驱动EEPROM
  • 16_HTML5 语义元素 --[HTML5 API 学习之旅]
  • 如何查看pad的console输出,以便我们更好的进行调试,查看并了解实际可能的问题。
  • Datawhale AI 冬令营学习笔记-零编程基础制作井字棋小游戏
  • WebAPI编程(第一天,第二天)
  • 深入解析 Spring Bean 配置与装配:从基础到进阶的实用指南
  • LeetCode 59. 螺旋矩阵 II (C++实现)
  • 算法——二分查找
  • 图的最短路径(C++实现图【4】)
  • Docker、containerd、安全沙箱、社区Kata Containers运行对比
  • 【基于rust-wasm的前端页面转pdf组件和示例】
  • ant design学习记录:响应式尺寸头像大小 Avatar
  • react杂乱笔记(一)
  • 【数据库】SQL应该如何针对数据倾斜问题进行优化
  • 部署开源大模型的硬件配置全面指南
  • 【es6复习笔记】迭代器(10)
  • Web入门常用标签、属性、属性值
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证2)
  • 数据结构与算法易错问题总结
  • 云备份项目--工具类编写
  • Unity AVPro Video使用和WebGL播放视频流
  • 谷歌浏览器的网络安全检测工具介绍
  • 【Linux网络编程】第十三弹---构建HTTP响应与请求处理系统:从HttpResponse到HttpServer的实战
  • 【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)
  • 基于谱聚类的多模态多目标浣熊优化算法(MMOCOA-SC)求解ZDT1-ZDT4,ZDT6和工程应用--盘式制动器优化,MATLAB代码
  • vite + vue3 + tailwind 启动之后报错