SqlQuery不是EF Core Dbset()中的定义



我对使用EF Core很陌生,所以我可能有一些误解,但是我可以检查为什么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;
}
<<p>Db上下文/strong>
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);
}
}

每当调用DeleteCSVProxy()时,我试图重置Db内的[Key] RecordId's计数。但由于EF Core不承认SqlQuery()的某种原因,我不太确定我应该如何进行这个。

错误:

错误CS1061
'DbSet'不包含'ExecuteSqlCommand'的定义,并且没有可访问的扩展方法'ExecuteSqlCommand'接受类型'DbSet'的第一个参数可以找到(您是否缺少using指令或程序集引用?)

使用SqlQuery-看起来你遵循EF6(或EF5,在与EFCore5混淆)教程,并试图将其建议应用到EFCore;它们是完全不同的动物

EF Core 5版本看起来像

_proxydb.CSVFileProxys.ExecuteSqlRaw($"DBCC CHECKIDENT('CSVProxyDbContextConnection', RESEED, 0)"); 

或者如果你使用一些参数:

_proxydb.CSVFileProxys.ExecuteSqlInterpolated($"DBCC CHECKIDENT('{someParam}', RESEED, {anotherParam})");  

重要:如果你传递一个内嵌参数的插值字符串,使用ExecuteSqlInterpolated;EFCore将把它拆开,然后把{..}转换成合适的SQL参数。ExecuteRaw它不会这样做,c#将形成SQL字符串,它不会被参数化。这是非常糟糕的

在早期(pre-3)的EF Core版本中,你只有一个方法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);

相关内容

最新更新