如何检查SQL数据库记录?EF条件添加逻辑错误排查
问题解答:检查SQL记录存在性与Entity Framework重复添加问题
先解决你的重复添加问题
你的代码逻辑完全写反了,这就是为什么每次运行都会重复插入John的原因!
先看你写的代码:
if (context.dBconfig.Any(c => n.Name != "John")) { context.dBconfig.Add( new List.dBconfig { Name = 'John', address = "test", contact = "test" } ); }
这里有两个明显的问题:
- 逻辑判断错误:你想表达的是“如果数据库里没有John的记录就添加”,但当前的条件是「只要数据库里存在任意一条Name不等于John的记录」就执行添加。哪怕数据库里已经有John了,只要还有其他记录,这个条件就会成立,自然会重复添加;如果数据库里只有John,这个条件会返回false,但你说每次都重复添加,大概率是第二个问题导致的。
- 变量错误:代码里的
n是哪里来的?看起来是未定义的变量,或者是你笔误把c写成了n?如果n是你要添加的新对象(比如n.Name就是"John"),那n.Name != "John"永远是false,Any()会返回false,反而不会添加——但你说重复添加,所以可能实际运行的代码里这个条件一直为true,比如n指向了其他对象。
修复后的代码
我帮你改好了,逻辑和语法都修正了:
// 先检查数据库中是否存在Name为John的记录 bool johnExists = context.dBconfig.Any(config => config.Name == "John"); if (!johnExists) { // 不存在则创建新记录并添加 var newConfig = new dBconfig // 这里应该是你的实体类名,不是List.dBconfig { Name = "John", // C#字符串要用双引号,单引号是单个字符的写法 Address = "test", Contact = "test" }; context.dBconfig.Add(newConfig); // 一定要调用SaveChanges才会把数据写入数据库! context.SaveChanges(); }
额外提醒几个点:
- 别漏了
context.SaveChanges(),不然添加的记录只会存在于内存中,不会持久化到数据库 - 实体类应该是
dBconfig,List<dBconfig>是集合类型,不能用来实例化单个实体对象 - C#里字符串必须用双引号,
'John'会编译报错
再说说如何检查SQL数据库中是否存在符合条件的记录
分两种场景来说:
1. 用原生SQL语句
最推荐用EXISTS子查询,因为它找到第一条匹配的记录就会停止查询,性能拉满:
-- 检查是否存在Name为John的记录 IF EXISTS (SELECT 1 FROM dBconfig WHERE Name = 'John') BEGIN PRINT '记录已存在' END ELSE BEGIN PRINT '记录不存在' END
如果是要在查询中返回存在性标识,可以用:
SELECT CASE WHEN EXISTS (SELECT 1 FROM dBconfig WHERE Name = 'John') THEN 1 ELSE 0 END AS IsJohnExists
2. 用Entity Framework
有几种方式,优先选性能最好的:
Any()方法(最推荐):会转换成SQL的EXISTS语句,性能最优bool exists = context.dBconfig.Any(c => c.Name == "John");FirstOrDefault()方法:返回第一个匹配的实体,没有则返回null,判断是否为null即可
但这种方式会返回整个实体的数据,如果你只需要判断存在性,没必要用这个var record = context.dBconfig.FirstOrDefault(c => c.Name == "John"); bool exists = record != null;Count()方法:统计匹配的记录数,判断是否大于0
不推荐,因为它会扫描所有匹配的记录并计数,性能最差bool exists = context.dBconfig.Count(c => c.Name == "John") > 0;
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

