我来为您提供一个在 .NET Framework 4.8 环境下使用 Entity Framework 和 Microsoft.Data.Sqlite 管理 SQLite 数据库的实现方案。
1. 项目配置
首先需要安装必要的 NuGet 包:
2. 数据模型定义
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Table("Users")]
public class User
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(100)]
public string Name { get; set; }
[MaxLength(255)]
public string Email { get; set; }
public DateTime CreatedAt { get; set; }
}
[Table("Products")]
public class Product
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(200)]
public string Name { get; set; }
public decimal Price { get; set; }
public int Stock { get; set; }
}
3. DbContext 实现
using Microsoft.EntityFrameworkCore;
using System.IO;
public class AppDbContext : DbContext
{
public DbSet Users { get; set; }
public DbSet Products { get; set; }
private readonly string _connectionString;
public AppDbContext()
{
var dbPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "app.db");
_connectionString = $"Data Source={dbPath}";
}
public AppDbContext(string connectionString)
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlite(_connectionString);
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.CreatedAt)
.HasDefaultValueSql("CURRENT_TIMESTAMP");
});
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.HasIndex(e => e.Name);
});
base.OnModelCreating(modelBuilder);
}
}
4. 数据库服务封装
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public class DatabaseService
{
private readonly string _connectionString;
public DatabaseService(string connectionString = null)
{
if (string.IsNullOrEmpty(connectionString))
{
var dbPath = System.IO.Path.Combine(
System.AppDomain.CurrentDomain.BaseDirectory, "app.db");
_connectionString = $"Data Source={dbPath}";
}
else
{
_connectionString = connectionString;
}
}
// 初始化数据库
public void InitializeDatabase()
{
using var context = new AppDbContext(_connectionString);
context.Database.EnsureCreated();
}
// 用户相关操作
public async Task CreateUserAsync(string name, string email)
{
using var context = new AppDbContext(_connectionString);
var user = new User
{
Name = name,
Email = email,
CreatedAt = DateTime.Now
};
context.Users.Add(user);
await context.SaveChangesAsync();
return user;
}
public async Task> GetAllUsersAsync()
{
using var context = new AppDbContext(_connectionString);
return await context.Users.ToListAsync();
}
public async Task GetUserByIdAsync(int id)
{
using var context = new AppDbContext(_connectionString);
return await context.Users.FindAsync(id);
}
public async Task UpdateUserAsync(int id, string name, string email)
{
using var context = new AppDbContext(_connectionString);
var user = await context.Users.FindAsync(id);
if (user != null)
{
user.Name = name;
user.Email = email;
await context.SaveChangesAsync();
}
return user;
}
public async Task DeleteUserAsync(int id)
{
using var context = new AppDbContext(_connectionString);
var user = await context.Users.FindAsync(id);
if (user != null)
{
context.Users.Remove(user);
await context.SaveChangesAsync();
return true;
}
return false;
}
// 产品相关操作
public async Task CreateProductAsync(string name, decimal price, int stock)
{
using var context = new AppDbContext(_connectionString);
var product = new Product
{
Name = name,
Price = price,
Stock = stock
};
context.Products.Add(product);
await context.SaveChangesAsync();
return product;
}
public async Task> GetAllProductsAsync()
{
using var context = new AppDbContext(_connectionString);
return await context.Products.ToListAsync();
}
public async Task GetProductByIdAsync(int id)
{
using var context = new AppDbContext(_connectionString);
return await context.Products.FindAsync(id);
}
public async Task UpdateProductAsync(int id, string name, decimal price, int stock)
{
using var context = new AppDbContext(_connectionString);
var product = await context.Products.FindAsync(id);
if (product != null)
{
product.Name = name;
product.Price = price;
product.Stock = stock;
await context.SaveChangesAsync();
}
return product;
}
}
5. 使用示例
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
try
{
// 初始化数据库服务
var dbService = new DatabaseService();
dbService.InitializeDatabase();
// 创建用户
var user = await dbService.CreateUserAsync("张三", "zhangsan@example.com");
Console.WriteLine($"创建用户: {user.Name}, ID: {user.Id}");
// 创建产品
var product = await dbService.CreateProductAsync("笔记本电脑", 5999.99m, 10);
Console.WriteLine($"创建产品: {product.Name}, 价格: {product.Price}");
// 查询所有用户
var users = await dbService.GetAllUsersAsync();
Console.WriteLine("所有用户:");
foreach (var u in users)
{
Console.WriteLine($" {u.Id}: {u.Name} ({u.Email})");
}
// 查询所有产品
var products = await dbService.GetAllProductsAsync();
Console.WriteLine("所有产品:");
foreach (var p in products)
{
Console.WriteLine($" {p.Id}: {p.Name} - ¥{p.Price} (库存: {p.Stock})");
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
Console.ReadKey();
}
}
6. 配置文件 (App.config)
关键要点
1. 版本兼容性: 使用 Entity Framework Core 3.1,这是支持 .NET Framework 4.8 的最后一个版本
2. SQLite 驱动: 使用 Microsoft.Data.Sqlite 而不是传统的 System.Data.SQLite
3. 异步支持: 所有数据库操作都提供异步版本以提高性能
4. 连接字符串: 支持自定义数据库路径,默认在应用程序目录下创建 app.db
5. 数据库初始化: 使用 EnsureCreated() 方法自动创建数据库和表结构
这个方案提供了完整的 SQLite 数据库管理功能,包括增删改查操作,并且完全兼容 .NET Framework 4.8 环境。