我对使用EF非常陌生,所以我可能有一些误解,但我能检查一下为什么SqlQuery
不是Dbset()
的适当方法吗?
下面是我的代码片段,以展示我是如何设置DbContext
的
模型
public class CSVFile
{
[Key]
public int RecordId { get; set; } = 0;
public double CO2 { get; set; } = 0.0;
public double ambTemp { get; set; } = 0.0;
public double relativeHumidity { get; set; } = 0.0;
}
Db上下文
public class CSVProxyDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
var connectionString = string.Format(@"Data Source=name;Initial Catalog=CSVProxyDb;Integrated Security=True;MultipleActiveResultSets=True");
options.UseSqlServer(connectionString);
}
public DbSet<CSVFileProxy> CSVFileProxys { get; set; }
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<CSVProxyDbContext>();
services.AddControllersWithViews();
services.AddScoped<ICSVService, CSVService>();
services.AddRazorPages();
}
控制器片段
public class CSVController : Controller
{
ICSVService _csvService = null;
List<CSVFile> _records = new List<CSVFile>();
List<CSVFileProxy> _proxyRecords = new List<CSVFileProxy>();
private readonly CSVProxyDbContext _proxydb;
public CSVController(ICSVService csvService, CSVProxyDbContext proxydb)
{
_csvService = csvService;
_proxydb = proxydb;
}
public JsonResult DeleteCSVProxy(List<CSVFileProxy> proxyRecords)
{
_proxydb.CSVFileProxys.RemoveRange(_proxydb.CSVFileProxys);
_proxydb.CSVFileProxys.SqlQuery("DBCC CHECKIDENT('CSVProxyDbContextConnection', RESEED, 0)");
_proxydb.SaveChanges();
return Json(null);
}
}
每当调用[Key] RecordId
时,我都试图在Db中重置DeleteCSVProxy()
的计数,但是由于EF由于某些原因不承认SqlQuery()
,所以我不太确定该如何处理。
错误:
误差CS1061
'DbSet‘不包含'ExecuteSqlCommand’的定义,也找不到接受'DbSet‘类型的第一个参数的可访问扩展方法'ExecuteSqlCommand’(您缺少使用指令还是程序集引用?)?
发布于 2021-10-19 01:59:43
使用SqlQuery
--看上去您正在遵循EF6 (或者EF5,与EFCore5混淆)的教程,并试图将其建议应用于EFCore5;它们是完全不同的动物
EF Core 5版本将类似于
_proxydb.CSVFileProxys.ExecuteSqlRaw($"DBCC CHECKIDENT('CSVProxyDbContextConnection', RESEED, 0)");
或者如果你使用的是一些参数:
_proxydb.CSVFileProxys.ExecuteSqlInterpolated($"DBCC CHECKIDENT('{someParam}', RESEED, {anotherParam})");
:如果您传递嵌入参数的内插字符串,则使用ExecuteSqlInterpolated
;EFCore会将其分离并将{..}转换为适当的ExecuteSqlInterpolated
参数。ExecuteRaw
将不会这样做,C#将形成string,并且它不会被参数化。这是非常糟糕的
在早期(预-3) EF版本中,您只有一种方法ExecuteSql
,它遇到了一些问题;如果您不将SQL格式str直接放入打开注入攻击的方法中:
//acceptable
_proxydb.CSVFileProxys.ExecuteSql($"DBCC CHECKIDENT('{someParam}', RESEED, {anotherParam})");
//not good
var sql = $"DBCC CHECKIDENT('{someParam}', RESEED, {anotherParam})";
_proxydb.CSVFileProxys.ExecuteSql(sql);
https://stackoverflow.com/questions/69581265
复制相似问题