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

Entity Framework中使用SqlQuery<T>从SQL Server查询数据失败

解决Entity Framework中SqlQuery映射非实体类型的错误

问题原因

你使用的CreatedByAuditTrial是自定义ViewModel,未在DbContext中注册为实体类型,EF无法自动完成查询结果到该类型的映射,因此抛出类型不支持的错误。

解决方案

方案1:将ViewModel注册为无键实体(推荐)

在你的DbContext类中重写OnModelCreating方法,把CreatedByAuditTrial注册为无键实体:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 注册无键实体,让EF能识别并映射查询结果
    modelBuilder.Entity<CreatedByAuditTrial>().HasNoKey();
}

之后修改查询代码,使用EF Core推荐的FromSqlRaw方法(替代旧的Database.SqlQuery):

var usermstHsCreateDetail = db.Set<CreatedByAuditTrial>()
                              .FromSqlRaw("SELECT ID, CreatedBy, CreatedOn FROM USERMST")
                              .ToList();

方案2:配置默认类型映射

如果不想注册实体,可以通过ModelConfigurationBuilder为CreatedByAuditTrial配置默认类型映射。在DbContext的配置代码中添加:

builder.Services.AddDbContext<YourDbContext>(options =>
    options.UseSqlServer("你的数据库连接字符串")
           .ConfigureModelBuilder(modelBuilder =>
               modelBuilder.DefaultTypeMapping<CreatedByAuditTrial>(typeBuilder =>
               {
                   typeBuilder.Property<int>("ID");
                   typeBuilder.Property<string>("CreatedBy");
                   typeBuilder.Property<DateTime>("CreatedOn");
               })));

配置完成后即可正常使用Database.SqlQuery<T>方法。

方案3:改用匿名类型转换(临时应急)

如果只是临时查询需求,可先用匿名类型接收结果,再转换为目标ViewModel:

var rawData = db.Database.SqlQuery<dynamic>("SELECT ID, CreatedBy, CreatedOn FROM USERMST")
                          .ToList();
var usermstHsCreateDetail = rawData.Select(item => new CreatedByAuditTrial
{
    ID = item.ID,
    CreatedBy = item.CreatedBy,
    CreatedOn = item.CreatedOn
}).ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:42:06