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

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 AddAccountGameRelation
    Update-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:18:03