2011-05-27 48 views
3

我使用實體框架作爲我的數據訪問層。 但對於某些任務(例如批量刪除),我想使用原始SQL命令。EF不執行刪除命令

但是在這一點上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爲一個字符串? – 2011-05-27 07:56:19

+0

你說得對。 string.Concat不是必需的。但是這並不影響executeSqlCommand – BitKFu 2011-05-27 08:03:59

+0

@BitKFu我從來沒有說過這是問題所在。如果這是問題,我會把它變成一個答案:) – 2011-05-27 08:07:16

回答

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); 
+0

no。即使沒有分號,也不會刪除任何內容。 – BitKFu 2011-05-27 08:06:00

+0

@BitKFu - 見上面 – 2011-05-27 08:19:55

+0

這也不起作用,因爲它會因爲錯誤的sql語法而引發異常。在你提出問題之前:我先用CONVERT sql語法嘗試過。但這似乎不成問題。你知道我是否可以將SQL發送到SQL Server? – BitKFu 2011-05-27 08:26:29