在.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
相关产品推荐
相关产品推荐

