C# 使用EF通过RFID查询SQL数据库数据返回null如何解决?
排查方案与修复代码
1 核心问题排查方向
- 实体类与数据库列映射不匹配:你数据库中的
First Name、Last Name列名带空格,EF默认按属性名匹配列名,没有显式映射的话会找不到对应字段,连带查询逻辑异常。 - RFID字段类型不匹配:示例中RFID值为数字格式,若数据库中RFID是
bigint/int类型,而实体类中RFID定义为string,或传入的key格式不符合字段要求,会导致比对失败。 - 连接字符串指向错误:无参构造的DbContext默认读取配置文件中的默认连接字符串,可能实际连接的不是你存放测试数据的目标库。
- 入参存在冗余字符:传入的RFID key前后存在空格、换行符,和数据库存储的值不匹配。
2 修复代码示例
第一步:修正ATM实体类映射
using System.ComponentModel.DataAnnotations.Schema; public class ATM { public int ID { get; set; } // 显式映射带空格的数据库列名 [Column("First Name")] public string FirstName { get; set; } [Column("Last Name")] public string LastName { get; set; } public int Balance { get; set; } public string Password { get; set; } // 这里类型和数据库RFID字段保持一致,若为数字类型就改成public long RFID { get; set; } public string RFID { get; set; } }
第二步:优化查询逻辑
// 方法名建议和功能匹配,原方法名GetByName不符合按RFID查询的逻辑 public string GetByRFID(string rfidKey) { if (string.IsNullOrWhiteSpace(rfidKey)) return "couldnotfound"; using (ATMServerContext atmServerContext = new ATMServerContext()) { // 去掉前后空格再比对,避免冗余字符影响 var cleanKey = rfidKey.Trim(); // 若RFID是数字类型,先做类型转换再查询 if (long.TryParse(cleanKey, out long rfidNum)) { // 对应实体类RFID为long的场景 var atm = atmServerContext.Atms.FirstOrDefault(x => (long)x.RFID == rfidNum); return atm != null ? $"{atm.FirstName} {atm.LastName}" : "couldnotfound"; } // 对应实体类RFID为string的场景 else { var atm = atmServerContext.Atms.FirstOrDefault(x => x.RFID.Trim() == cleanKey); return atm != null ? $"{atm.FirstName} {atm.LastName}" : "couldnotfound"; } } }
第三步:优化上下文配置便于排查
public class ATMServerContext:DbContext { // 显式指定连接字符串,避免读错配置,括号内对应你配置文件里的连接字符串name public ATMServerContext() : base("name=ATMServerDB") { // 调试阶段打开SQL日志,输出生成的查询语句到调试窗口,可直接拿语句到数据库执行验证 this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); } public DbSet<ATM> Atms { get; set; } }
内容的提问来源于stack exchange,提问作者TC Kutay Ertürk
相关产品推荐
相关产品推荐

