2015-06-25 39 views
4

我正在通過ASP.NET MVC應用程序將CSV導入到SQL數據庫中。EntityFramework。刪除所有行然後添加新的。異步

我遍歷CSV中的所有行,爲每個行創建一個等效實體並將其添加到當前上下文中。

如果至少有一行要添加,那麼我想從正在寫入的表中刪除所有現有的行,然後提交新的實體。

我的問題是,它是否是安全的呼籲ExecuteSqlCommandAsync,而不是等待結果之前,我隨後致電await db.SaveChangesAsync();像這樣:

db.Database.ExecuteSqlCommandAsync("delete from tblName"); 
await db.SaveChangesAsync(); 

或者我應該await刪除通話之前,我做了保存更改打電話?在這種情況下,我可能會調用非異步版本?

我目前沒有在等待它,並且一切似乎都按照預期在本地工作(實際上沒有延遲),即現有數據正在被刪除並添加了新數據。我擔心的是,在解決方案部署時是否還有其他問題需要考慮,Web服務器和SQL服務器不一定在同一個盒子上。

回答

1

MSDN

默認情況下,DELETE語句總是獲取關於它修改表的排它(X)鎖,並持有該鎖直到事務完成。

這意味着保存操作將等待直到刪除操作完成,即使後者已啓動異步。所以,由於您等待保存呼叫,實際上您還在等待刪除呼叫。

我想我寧願顯式等待刪除調用(或不要調用它的異步),因爲你可能想要回應它引發的任何錯誤(如不執行保存操作,而是寫入日誌)。

附註:考慮使用TRUNCATE TABLE

1

EF不支持同一對象的併發使用。這不安全。現在有多個線程寫入相同的EF對象,除非另有說明,否則這些線程不安全。

即使這對EF來說是安全的,也不能保證在保存開始時刪除甚至開始。

錯誤處理也丟失。

我不明白你爲什麼要這樣做。這提供了什麼好處?當然沒有更多的吞吐量。延遲也不會減少,因爲刪除必須在保存開始前完成。

相關問題