EF Core 6中无需DbSet获取表数据及调用存储过程/视图的问题咨询
问题解答
1. 不使用DbSet获取表数据的可行方案
- 视图实现:完全没问题。先在数据库创建视图,然后在EF Core里创建对应实体类,给实体加上
[Keyless]特性(因为视图一般没有主键),接着在DbContext中添加DbSet<你的实体类>并映射到这个视图,之后就能像查询普通表一样查询视图数据,相当于把视图当作无主键的表来处理。 - 直接执行SQL查询:如果不想定义DbSet,也可以通过手动创建数据库命令、读取数据并映射到对象的方式实现,不过这种方式代码量会多一些,后面会给出示例。
2. 存储过程返回数据映射到对象
有两种常用方式:
- 官方推荐:Keyless实体+FromSqlRaw:先定义对应结果结构的无主键实体(加
[Keyless]),在DbContext注册该实体的DbSet,然后用FromSqlRaw调用存储过程:[Keyless] public class SpResult { public int Id { get; set; } public string Content { get; set; } } // DbContext中注册 public DbSet<SpResult> SpResults { get; set; } // 调用存储过程 var params = new SqlParameter[] { new SqlParameter("@Param1", value1) }; var result = context.SpResults.FromSqlRaw("EXEC YourStoredProc @Param1", params).ToList(); - 手动读取映射:如果不想注册DbSet,可以直接操作数据库命令:
using var command = context.Database.GetDbConnection().CreateCommand(); command.CommandText = "EXEC YourStoredProc @Param1"; command.Parameters.Add(new SqlParameter("@Param1", value1)); context.Database.OpenConnection(); using var reader = command.ExecuteReader(); var resultList = new List<SpResult>(); while (reader.Read()) { resultList.Add(new SpResult { Id = reader.GetInt32(reader.GetOrdinal("Id")), Content = reader.GetString(reader.GetOrdinal("Content")) }); }
3. EF Core 6找不到SqlQuery方法的原因及解决
EF Core 3.x之后Database.SqlQuery就被移除了,EF Core 6里可以用这些替代方案:
- Keyless实体+FromSqlRaw/FromSqlInterpolated:这是官方主推的方式,前面已经给出示例,既可以查询表、视图,也可以调用存储过程。
- 使用第三方扩展:比如安装
EFCore.SqlQueryNuGet包,安装后就能直接用context.Database.SqlQuery<YourEntity>("SELECT ...").ToList(),但如果可以,优先用官方方案。
内容的提问来源于stack exchange,提问作者dmmhlchk
相关产品推荐
相关产品推荐

