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

在.NET Maui中使用EF Core+SQLite创建外键遇错求助

解决.NET Maui EF Core 7 + SQLite 关联数据存储异常问题

问题根源

你误用了SQLite-net的CreateTable<T>方法来创建EF Core定义的模型表,而SQLite-net不识别EF Core的导航属性(ICollection<CheckListItem>、CheckList),这才导致抛出NotSupportedException。EF Core和SQLite-net是两套独立的ORM框架,不能混用API。

正确解决步骤

1. 修正数据模型定义

确保外键和导航属性配置符合EF Core规范,示例如下:

// CheckList 模型
public class CheckList
{
    public int Id { get; set; }
    public string Title { get; set; }

    // 导航属性:一对多关联,初始化集合避免空引用
    public ICollection<CheckListItem> CheckListItems { get; set; } = new List<CheckListItem>();
}

// CheckListItem 模型
public class CheckListItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsCompleted { get; set; }

    // 外键属性:关联CheckList的Id
    public int CheckListId { get; set; }
    // 导航属性:多对一关联
    public CheckList CheckList { get; set; }
}

2. 配置EF Core DbContext

创建继承DbContext的上下文类,指定SQLite连接:

public class AppDbContext : DbContext
{
    public DbSet<CheckList> CheckLists { get; set; }
    public DbSet<CheckListItem> CheckListItems { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 获取数据库文件路径(.NET Maui 中正确的路径写法)
        string dbPath = Path.Combine(FileSystem.AppDataDirectory, "checklists.db");
        optionsBuilder.UseSqlite($"Data Source={dbPath}");
    }

    // 可选:用Fluent API明确配置关联关系(如果约定配置不生效)
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CheckListItem>()
            .HasOne(cli => cli.CheckList)
            .WithMany(cl => cl.CheckListItems)
            .HasForeignKey(cli => cli.CheckListId);
    }
}

3. 使用EF Core API 创建数据库/表

完全弃用SQLite-net的CreateTable<T>,改用EF Core的方法初始化数据库:

// 在应用初始化时执行(比如App.xaml.cs的OnStart方法)
using var context = new AppDbContext();
// 方式1:执行迁移(推荐,支持后续 schema 更新)
context.Database.Migrate();
// 方式2:直接创建数据库和表(仅首次创建,不支持迁移)
// context.Database.EnsureCreated();

4. 修复迁移文件问题

如果之前生成的迁移文件有问题,按以下步骤重置:

  • 在包管理器控制台执行:Remove-Migration(删除最近的迁移文件)
  • 重新生成初始迁移:Add-Migration InitialCreate
  • 执行迁移:Update-Database(或者代码里调用Migrate())

关键注意事项

  • 绝对不要同时使用EF Core和SQLite-net的API,两套框架的模型定义和表创建逻辑不兼容
  • EF Core会自动处理外键关系的生成,无需手动创建外键
  • 导航属性必须初始化(比如= new List<CheckListItem>()),避免后续操作出现空引用异常

内容的提问来源于stack exchange,提问作者Gratzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:32:19