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

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.SqlQuery NuGet包,安装后就能直接用context.Database.SqlQuery<YourEntity>("SELECT ...").ToList(),但如果可以,优先用官方方案。

内容的提问来源于stack exchange,提问作者dmmhlchk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:13:10