如何在C#中将含Card列表的Deck类对象存入SQLite数据库?
解决思路与实现步骤
一、Deck与Card的数据库存储方案
SQLite是关系型数据库,无法直接存储对象列表,需要按照关系型数据范式拆分表,通过外键建立关联。推荐用ORM框架(比如EF Core或Dapper)简化操作,避免手写复杂SQL。
1. 表结构设计
拆分为两张表:
Decks:存储Deck的基本信息(主键Id、名称等)Cards:存储单张卡牌信息,用DeckId作为外键关联所属Deck
2. 代码实现(EF Core版,新手友好)
第一步:安装NuGet包
在项目中安装Microsoft.EntityFrameworkCore.Sqlite
第二步:定义实体类
public class Deck { public int Id { get; set; } // 自增主键 public string Name { get; set; } // 示例属性:卡组名称 public List<Card> Cards { get; set; } = new List<Card>(); // 导航属性 } public class Card { public int Id { get; set; } // 自增主键 public string Content { get; set; } // 示例属性:卡牌内容 public int DeckId { get; set; } // 外键,关联Deck的Id public Deck Deck { get; set; } // 导航属性 }
第三步:配置DbContext
public class AppDbContext : DbContext { // 对应数据库中的表 public DbSet<Deck> Decks { get; set; } public DbSet<Card> Cards { get; set; } // 配置SQLite连接字符串 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=MyDeckDatabase.db"); } // 配置一对多关系 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Deck>() .HasMany(deck => deck.Cards) .WithOne(card => card.Deck) .HasForeignKey(card => card.DeckId); } }
第四步:存储Deck和卡牌列表
using (var context = new AppDbContext()) { // 自动创建数据库和表(首次运行时) context.Database.EnsureCreated(); // 创建带卡牌的卡组 var myDeck = new Deck { Name = "新手卡组", Cards = new List<Card> { new Card { Content = "火球术" }, new Card { Content = "治疗术" } } }; // 添加到上下文并保存 context.Decks.Add(myDeck); context.SaveChanges(); // EF Core会自动处理外键关联,把Deck的Id填充到Cards的DeckId字段 }
3. 原生SQL版(适合理解底层逻辑)
如果想手动控制SQL,步骤如下:
- 手动创建两张表:
CREATE TABLE Decks ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL ); CREATE TABLE Cards ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Content TEXT NOT NULL, DeckId INTEGER NOT NULL, FOREIGN KEY (DeckId) REFERENCES Decks(Id) );
- 先插入Deck,获取自增的
Id,再批量插入Cards:
// 伪代码,需用SQLiteConnection执行 var deckId = InsertDeckAndReturnId("新手卡组"); InsertCards(new List<Card> { ... }, deckId);
二、数据库入门学习建议
- 先啃基础:优先理解主键、外键、一对多关系、SQL基本语句(CREATE/INSERT/SELECT/JOIN),这些是关系型数据库的核心,搞懂了再用ORM才不会懵
- 小步迭代:不要一开始就想做复杂功能,先把"存Deck、取Deck、关联Cards"这几个最小功能跑通,再逐步扩展
- 从SQLite原生SQL入手:先写原生SQL操作数据库,理解数据流转逻辑,再用ORM简化开发
- 官方文档优先:EF Core和SQLite的官方文档有大量针对新手的示例,比零散教程更权威
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

