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

.NET Core调用存储过程:PrvProduct类非Key字段映射为空问题

解决.NET Core调用存储过程仅[Key]字段赋值的问题

嘿,这个问题我之前也碰到过!从你给出的PrvProduct实体类代码来看,有几个很明确的点可以排查,咱们一步步来解决:

1. 先修复实体类的字段定义

你注意到了吗?你的ProductLineId是一个字段(没有get; set;访问器),而EF Core默认只会识别并映射带有get和set的自动属性。这就导致EF在处理存储过程返回的结果时,直接跳过了这个字段,自然不会给它赋值。

把它改成自动属性就好:

public class PrvProduct { 
    [Key] 
    public Int32 ProductId { get; set; } 
    public Int64 ProductLineId { get; set; } // 加上get; set;访问器
    public String MfgPartNumber { get; set; } 
    public String ProductName { get; set; } 
    public String ProductDescription { get; set; } 
}

2. 检查存储过程返回列名与实体属性名的匹配度

如果改完上面的还是不行,那大概率是存储过程返回的列名和你的实体属性名不匹配。比如存储过程里返回的是mfg_part_number,但你的属性是MfgPartNumber,EF Core的自动命名映射可能没生效,或者列名完全不一致。

这里有两种解决思路:

  • 调整存储过程:让返回的列名和实体属性名完全一致(比如把mfg_part_number改为MfgPartNumber)
  • 手动配置映射:在你的DbContext的OnModelCreating方法里,指定属性对应的列名:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<PrvProduct>()
        .Property(p => p.MfgPartNumber)
        .HasColumnName("mfg_part_number"); // 替换成存储过程返回的实际列名
    // 其他字段如果有匹配问题,同理配置
}

3. 确认存储过程的调用方式正确

你调用存储过程的代码是不是类似这样?如果用的是FromSqlRaw,要确保查询能正确映射到实体:

var products = _context.PrvProducts
    .FromSqlRaw("EXEC GetPrvProducts")
    .ToList();

另外,如果存储过程需要参数,一定要用参数化查询避免SQL注入,比如:

var param = new SqlParameter("@ProductLineId", 123);
var products = _context.PrvProducts
    .FromSqlRaw("EXEC GetPrvProducts @ProductLineId", param)
    .ToList();

4. 排查是否有其他映射冲突

如果上面的步骤都试过了还是不行,检查一下你的DbContext里有没有对PrvProduct做特殊配置,比如不小心忽略了某些属性,或者错误地映射到了其他表/视图。

按照这些步骤来,应该就能解决只有ProductId有值的问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:06:04