首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SqlQuery不是EF ()中的定义

SqlQuery不是EF ()中的定义
EN

Stack Overflow用户
提问于 2021-10-15 07:28:25
回答 1查看 387关注 0票数 1

我对使用EF非常陌生,所以我可能有一些误解,但我能检查一下为什么SqlQuery不是Dbset()的适当方法吗?

下面是我的代码片段,以展示我是如何设置DbContext

模型

代码语言:javascript
代码运行次数:0
运行
复制
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上下文

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<CSVProxyDbContext>();
            services.AddControllersWithViews();
            services.AddScoped<ICSVService, CSVService>();
            services.AddRazorPages();
        }

控制器片段

代码语言:javascript
代码运行次数:0
运行
复制
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’(您缺少使用指令还是程序集引用?)?

EN

回答 1

Stack Overflow用户

发布于 2021-10-19 09:59:43

使用SqlQuery --看上去您正在遵循EF6 (或者EF5,与EFCore5混淆)的教程,并试图将其建议应用于EFCore5;它们是完全不同的动物

EF Core 5版本将类似于

代码语言:javascript
代码运行次数:0
运行
复制
_proxydb.CSVFileProxys.ExecuteSqlRaw($"DBCC CHECKIDENT('CSVProxyDbContextConnection', RESEED, 0)"); 

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

代码语言:javascript
代码运行次数:0
运行
复制
_proxydb.CSVFileProxys.ExecuteSqlInterpolated($"DBCC CHECKIDENT('{someParam}', RESEED, {anotherParam})");  

:如果您传递嵌入参数的内插字符串,则使用ExecuteSqlInterpolated;EFCore会将其分离并将{..}转换为适当的ExecuteSqlInterpolated参数。ExecuteRaw将不会这样做,C#将形成string,并且它不会被参数化。这是非常糟糕的

在早期(预-3) EF版本中,您只有一种方法ExecuteSql,它遇到了一些问题;如果您不将SQL格式str直接放入打开注入攻击的方法中:

代码语言:javascript
代码运行次数:0
运行
复制
//acceptable
_proxydb.CSVFileProxys.ExecuteSql($"DBCC CHECKIDENT('{someParam}', RESEED, {anotherParam})");

//not good
var sql = $"DBCC CHECKIDENT('{someParam}', RESEED, {anotherParam})";
_proxydb.CSVFileProxys.ExecuteSql(sql);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69581265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档