执行Update-Database命令未生成Entity Framework模型ICollection属性问题
排查解决方案
你可以按以下几个常见场景逐一检查调整:
- 修正从属类的关联关系注解
你当前的从属类仅定义了外键字段和导航属性,没有显式指定关联,EF默认约定很容易出现匹配异常。首先建议修改从属类中和类名重名的属性(避免命名冲突),同时加外键关联注解,示例:
同时可以给主类的集合属性加反向关联注解,避免歧义:public class TypeToAdd { [Key] public int TypeToAddId { get; set; } // 不要和类名重名,避免EF解析出错 public string TypeToAddName { get; set; } public int Qty { get; set; } public int Subscriptions_Regular_Id { get; set; } // 显式指定对应外键字段 [ForeignKey(nameof(Subscriptions_Regular_Id))] public Subscriptions Subscriptions { get; set; } }[InverseProperty(nameof(TypeToAdd.Subscriptions))] public ICollection<TypeToAdd> TypeToAdd { get; set; } // 另外两个集合属性也对应加上同款注解即可 - 检查DbContext是否注册了从属实体
确保你的上下文类中已经添加了三个从属类的DbSet声明:public DbSet<SpecialType> SpecialTypes { get; set; } public DbSet<TypeToAdd> TypeToAdds { get; set; } public DbSet<TypeToRemove> TypeToRemoves { get; set; } - 查询时显式加载导航属性
EF Core默认不会自动加载关联数据,如果直接查询Subscriptions没有关联加载对应集合,这三个属性会保持默认值null,看起来就像“没有生成”。查询时需要显式加Include:
如果需要用延迟加载,给三个集合导航属性加上var subscription = context.Subscriptions .Include(s => s.SpecialType) .Include(s => s.TypeToAdd) .Include(s => s.TypeToRemove) .FirstOrDefault(s => s.Subscriptions_Regular_Id == 你的查询ID);virtual关键字,同时开启上下文的延迟加载配置即可。 - 初始化集合导航属性
可以在主类定义时直接初始化集合,避免空引用异常,也方便EF填充数据:public ICollection<SpecialType> SpecialType { get; set; } = new List<SpecialType>(); public ICollection<TypeToAdd> TypeToAdd { get; set; } = new List<TypeToAdd>(); public ICollection<TypeToRemove> TypeToRemove { get; set; } = new List<TypeToRemove>();
以上修改完成后,删除现有异常的迁移文件,重新生成迁移再更新数据库即可。
内容的提问来源于stack exchange,提问作者mswhat
相关产品推荐
相关产品推荐

