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

