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
相关产品推荐
相关产品推荐

