个人笔记: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 操作: 使用简单的方法实现插入、查询、更新和删除的功能。
源码: