C# MVC环境下如何将对象列表存入对象并通过Entity Framework存到数据库
问题原因
集合类型的导航属性不会在主表生成对应列,Entity Framework默认通过在子表(GameModel对应表)添加外键的方式实现一对多关联,你看到的没有生成Apps列是正常的设计,只需要补全关系配置即可正常使用关联存储和查询。
解决步骤
第一步:补全模型关系配置
两种方案可二选一:
方案1:使用数据注解直接在模型类配置
先修改GameModel类,添加外键字段和可选的反向导航属性:public class GameModel { [Key] public int Id { get; set; } public string Name { get; set; } public bool VacBanned { get; set; } // 新增关联Account的外键字段 public int AccountId { get; set; } // 新增反向导航属性,可选配置 public AccountModel Account { get; set; } }再修改
AccountModel类,给Apps属性添加初始化逻辑避免空引用:public class AccountModel { [Key] public int Id { get; set; } public string Username { get; set; } public string Password { get; set; } public List<GameModel> Apps { get; set; } = new List<GameModel>(); public bool IsUseless { get; set; } }方案2:使用Fluent API在DbContext中配置(适合不想修改模型类的场景)
在你的DbContext类中重写OnModelCreating方法添加关系配置:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<AccountModel>() .HasMany(a => a.Apps) .WithOne() // 如果GameModel中已经添加了反向导航属性Account,就改为.WithOne(g => g.Account) .HasForeignKey("AccountId"); }第二步:生成并应用数据库迁移
打开包管理器控制台依次执行以下命令:Add-Migration AddAccountGameRelationUpdate-Database
执行完成后Game表会自动生成AccountId外键列,完成关系绑定。第三步:关联数据读写示例
存储带关联游戏的账户代码示例:var newAccount = new AccountModel { Username = "test_user", Password = "your_password", Apps = new List<GameModel> { new GameModel { Name = "CS2", VacBanned = false }, new GameModel { Name = "Dota 2", VacBanned = false } } }; yourDbContext.Accounts.Add(newAccount); yourDbContext.SaveChanges();查询带关联游戏的账户代码示例:
// 需要引用命名空间 using Microsoft.EntityFrameworkCore; var account = yourDbContext.Accounts .Include(a => a.Apps) .FirstOrDefault(a => a.Id == 目标账户ID);
内容的提问来源于stack exchange,提问作者AnTiCoD
相关产品推荐
相关产品推荐

