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

ASP.NET Core添加视图DbSet后触发SqlException:无效对象名'YearSummary'

问题原因与解决办法

问题根源

EF Core 默认会根据实体类名称(YearSummary)生成对应的数据库对象名,当你在AlphaContext中添加第二个DbSet<YearSummary>时,EF Core 会覆盖原有映射规则,把原本指向YearSummariesStatic表的查询,错误导向到不存在的YearSummary表,导致抛出Invalid object name 'YearSummary'异常。

解决方法

方法一:为视图创建独立实体类

如果静态表和动态视图的结构一致,也建议创建单独的实体类区分映射目标:

  1. 新增YearSummaryDynamic实体类,复制YearSummary的字段结构:
    public class YearSummaryDynamic
    {
        // 复制YearSummary的所有属性
        public int Year { get; set; }
        public decimal Total { get; set; }
        // ...其他字段
    }
    
  2. 更新AlphaContext中的DbSet定义:
    public DbSet<YearSummary> YearSummariesStatic { get; set; }
    public DbSet<YearSummaryDynamic> YearSummariesDynamic { get; set; }
    
  3. 在AlphaContext的OnModelCreating方法中明确映射规则:
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 绑定静态表
        modelBuilder.Entity<YearSummary>().ToTable("YearSummariesStatic");
        // 绑定动态视图(视图无主键需加HasNoKey)
        modelBuilder.Entity<YearSummaryDynamic>().ToView("YearSummariesDynamic").HasNoKey();
    }
    

方法二:为同一实体配置多个映射(需谨慎使用)

如果不想新增实体类,可以通过EF Core的实体配置,为同一个YearSummary实体指定不同的映射目标:

  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:42:43