You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,步骤如下:

  1. 手动创建两张表:
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)
);
  1. 先插入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:09:19