ASP.NET Core添加视图DbSet后触发SqlException:无效对象名'YearSummary'
问题原因与解决办法
问题根源
EF Core 默认会根据实体类名称(YearSummary)生成对应的数据库对象名,当你在AlphaContext中添加第二个DbSet<YearSummary>时,EF Core 会覆盖原有映射规则,把原本指向YearSummariesStatic表的查询,错误导向到不存在的YearSummary表,导致抛出Invalid object name 'YearSummary'异常。
解决方法
方法一:为视图创建独立实体类
如果静态表和动态视图的结构一致,也建议创建单独的实体类区分映射目标:
- 新增
YearSummaryDynamic实体类,复制YearSummary的字段结构:public class YearSummaryDynamic { // 复制YearSummary的所有属性 public int Year { get; set; } public decimal Total { get; set; } // ...其他字段 } - 更新
AlphaContext中的DbSet定义:public DbSet<YearSummary> YearSummariesStatic { get; set; } public DbSet<YearSummaryDynamic> YearSummariesDynamic { get; set; } - 在
AlphaContext的OnModelCreating方法中明确映射规则:protected override void OnModelCreating(ModelBuilder modelBuilder) { // 绑定静态表 modelBuilder.Entity<YearSummary>().ToTable("YearSummariesStatic"); // 绑定动态视图(视图无主键需加HasNoKey) modelBuilder.Entity<YearSummaryDynamic>().ToView("YearSummariesDynamic").HasNoKey(); }
方法二:为同一实体配置多个映射(需谨慎使用)
如果不想新增实体类,可以通过EF Core的实体配置,为同一个YearSummary实体指定不同的映射目标:
- 在
AlphaContext的OnModelCreating方法中,分别为两个DbSet指定对应的数据库对象:
注意:这种方式可能会引发实体状态管理的冲突,更推荐使用方法一。protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置YearSummariesStatic指向数据库表 modelBuilder.Entity<YearSummary>() .ToTable("YearSummariesStatic") .HasKey(x => x.Year); // 根据实际主键调整 // 配置YearSummariesDynamic指向数据库视图,需单独指定实体类型配置 modelBuilder.Entity<YearSummary>() .ToView("YearSummariesDynamic") .HasNoKey() .Ignore(x => x.SomeProperty); // 如果视图缺少表中的字段,需忽略 }
验证修复
修改后重新运行项目,查询Model.YearSummariesStatic时,EF Core会正确指向YearSummariesStatic表,不再报错。
内容的提问来源于stack exchange,提问作者Jim Becker
相关产品推荐
相关产品推荐

