EF Core的DbSet无SqlQuery定义,如何重置主键自增计数
报错原因
- EF Core 从3.0版本开始就移除了旧版EF6中
DbSet下的SqlQuery、ExecuteSqlCommand方法,API接口做了重构调整,所以会报CS1061找不到方法的错误。 - 你写的
DBCC CHECKIDENT语句参数错误,第一个参数应该填要重置自增序列的表名,不是数据库连接名,写不对的话就算SQL能执行也不会生效。
解决步骤
- 先确认你的项目已经正确安装了
Microsoft.EntityFrameworkCore.SqlServerNuGet包,原生SQL执行的扩展方法都包含在这个provider包中。 - 直接修改你的
DeleteCSVProxy方法代码即可,执行非查询类原生SQL需要通过DbContext的Database属性调用对应方法,修正后的代码如下:
public JsonResult DeleteCSVProxy(List<CSVFileProxy> proxyRecords) { _proxydb.CSVFileProxys.RemoveRange(_proxydb.CSVFileProxys); // 这里DBCC CHECKIDENT的第一个参数替换为你实际的表名,默认和DbSet属性名一致为CSVFileProxys _proxydb.Database.ExecuteSqlRaw("DBCC CHECKIDENT('CSVFileProxys', RESEED, 0)"); _proxydb.SaveChanges(); return Json(null); }
补充说明
- 如果你使用的是EF Core 7.0及以上版本,可以直接用更新的
ExecuteSql方法替代ExecuteSqlRaw,使用逻辑完全一致。 - 如果执行带用户传入参数的SQL语句,不要直接拼接字符串用
ExecuteSqlRaw,会有SQL注入风险,替换为ExecuteSqlInterpolated方法传参即可。 - 如果你需要执行查询SQL返回实体数据,原来的
DbSet.SqlQuery对应的替代方法是_proxydb.Set<CSVFileProxy>().FromSqlRaw("查询SQL"),仅适用于查询场景。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

