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

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

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

0.新建项目

选择C# 命令行项目。框架选.NET8.

建好后项目如下:

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

1. 设置环境

1.1. 添加 NuGet 包

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

bash 复制代码
Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Sqlite
Install-Package Microsoft.EntityFrameworkCore.Tools
1.2. 创建模型类

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

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

2. 创建上下文类

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

csharp 复制代码
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. 启用迁移

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

bash 复制代码
Add-Migration InitialCreate

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

3.2. 更新数据库

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

bash 复制代码
Update-Database

注意:date-Database -Verbose 可以获取更多信息,便于调试

4. 插入数据

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

csharp 复制代码
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. 查询数据

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

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

6. 更新数据

更新书籍信息的示例:

csharp 复制代码
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 删除书籍的示例:

csharp 复制代码
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. 完整示例

以下是一个完整的控制台应用程序示例,结合了上述所有功能:

csharp 复制代码
//========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}");
}
//==========
csharp 复制代码
//========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 操作 : 使用简单的方法实现插入、查询、更新和删除的功能。
    源码:
相关推荐
doubt。18 分钟前
【BUUCTF】[RCTF2015]EasySQL1
网络·数据库·笔记·mysql·安全·web安全
Maybe_ch41 分钟前
群晖部署-Calibreweb
数据库·群晖·nas
小辛学西嘎嘎1 小时前
MVCC在MySQL中实现无锁的原理
数据库·mysql
Zelotz1 小时前
线段树与矩阵
笔记
CC呢1 小时前
基于STM32单片机火灾安全监测一氧化碳火灾
数据库·mongodb
汇能感知2 小时前
光谱相机在智能冰箱的应用原理与优势
经验分享·笔记·科技
MasterNeverDown2 小时前
解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误
数据库·postgresql·oracle
limts2 小时前
Oracle之开窗函数使用
数据库·oracle
Pandaconda3 小时前
【Golang 面试题】每日 3 题(四十一)
开发语言·经验分享·笔记·后端·面试·golang·go
拾荒的小海螺4 小时前
JAVA:Spring WebClient 的应用指南
java·数据库·spring