EF Core7.0调用存储过程报错及相关问题咨询
问题解答:EF Core 7.0调用存储过程报错及无DbSet调用方法
1. 解决"Cannot create a DbSet for 'sp_MySP' because this type is not included in the model for the context"报错
报错的核心原因是你给sp_MySP类同时加了[Keyless]和[NotMapped]特性,其中[NotMapped]会强制EF Core将该类型排除在上下文模型之外,即便声明了DbSet<sp_MySP>也无法被识别。正确的修复步骤如下:
- 移除
sp_MySP类上的[NotMapped]特性,只保留[Keyless](存储过程返回结果通常无主键,无键实体正好匹配这种场景)。 - 确保
ModelContext中声明的DbSet<sp_MySP>有效,若需要更明确的配置,可在OnModelCreating方法中显式标记该实体为无键(可选,但能避免潜在的模型识别问题):
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<sp_MySP>().HasNoKey(); }
- 若项目使用了迁移,重新生成迁移并更新数据库,确保实体被正确纳入上下文模型。
完成以上操作后,原调用代码即可正常执行:
var data = _context.sp_MySP.FromSqlRaw("EXEC sp_MySP {0}", id).ToList();
2. 是否可以不将模型类定义在ModelContext中,直接使用FromSqlRaw调用存储过程?
直接用FromSqlRaw做不到,因为它是DbSet<T>的扩展方法,必须依托DbSet实例调用。但EF Core 7.0提供了Database.SqlQuery<T>方法,支持无需声明DbSet直接调用存储过程:
- 确保
sp_MySP类仅保留[Keyless]特性(移除[NotMapped]),类属性需与存储过程返回的字段一一匹配。 - 使用以下代码直接调用:
var data = _context.Database.SqlQuery<sp_MySP>("EXEC sp_MySP {0}", id).ToList();
这种方式不需要在ModelContext中声明DbSet<sp_MySP>,也无需额外的模型配置,适合单次或临时的存储过程调用场景。
内容的提问来源于stack exchange,提问作者Nitesh
相关产品推荐
相关产品推荐

