EF无法执行删除命令

3
我正在使用实体框架作为我的数据访问层。但对于一些任务(例如批量删除),我想使用原始的SQL命令。
但此时EF让我感到惊讶,因为它似乎执行了DML,但没有做任何事情。
如果我直接运行SQL,它会按预期执行并删除数据。那么我做错了什么?
    using (var db = new MyDbContext())
    {
        var sqlTime = string.Concat("DELETE FROM SYNCING_CONTENT WHERE ID in (SELECT SyncContent_Id FROM SYNCING WHERE EXPIRATION < GETDATE());");
        var deleted = db.Database.ExecuteSqlCommand(sqlTime);

        return deleted;
    }

编辑:

    using (var db = new MyDbContext())
    {
        const string SQL_TIME = "DELETE FROM SYNCING_CONTENT WHERE ID in (SELECT SyncContent_Id FROM SYNCING WHERE EXPIRATION < GETDATE())";
        var deleted = db.Database.ExecuteSqlCommand(SQL_TIME);

        return deleted;
    }

1
为什么在处理单个字符串时要使用string.concact呢? - Oskar Kjellin
你是对的。string.Concat 不是必需的。但这不会影响 executeSqlCommand 的执行。 - BitKFu
@BitKFu 我从未说过那是问题所在。如果那是问题的话,我会把它变成一个答案 :) - Oskar Kjellin
我需要提交这些更改吗?还是我需要为此打开一个事务?如果需要,我该如何实现? - BitKFu
@BitKFu 不需要提交。如果您直接在数据库中执行SQL,它是否有效? - Oskar Kjellin
是的,它会删除预期的行。 - BitKFu
1个回答

1

尝试从SQL字符串中删除分号。

此外,问题可能是由于在您的sql字符串中传递GETDATE()引起的。如果将其作为SQL参数传递,我知道这是一个问题。

请尝试

const string SQL_TIME = @"DELETE FROM SYNCING_CONTENT WHERE ID in (SELECT SyncContent_Id FROM SYNCING WHERE EXPIRATION < {0})";
db.Database.ExecuteSqlCommand(SQL_TIME, DateTime.Now);

没有分号也不会删除任何内容。 - BitKFu
那也不行,因为它会因为错误的SQL语法而抛出异常。在你提问之前:我之前尝试过使用CONVERT SQL语法。但这似乎不是问题所在。你知道我是否可以记录发送到SQL Server的SQL吗? - BitKFu
@BitKFu - 你可以使用工具/SQL分析器来查看执行的SQL。 - Nicholas Murray
@BitKFu - 尝试使用参数化 SQL - 同时您正在将 var deleted 设置为运行的 SQL 的结果,但是您的 SQL 没有返回任何值。 - Nicholas Murray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接