標籤:actually param delete size 子公司 cte link ogr 調用
net core 2.0發布後,一直想體驗下,因種種原因,一直在拖著沒進行。
前陣子公司要加個新的內部管理後台,正好可以用asp.net core來做下,體驗下net core的魅力。
啃過文檔後就上手了,一切很順利。
直到周五,出現了一個並發異常的問題,本以為可以很快處理掉的,但沒想到一直花費了很長時間才解決掉,現在記錄下情況,有相同經曆的夥伴以後可以參考。
先上異常。
異常提示:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See
http://go.microsoft.com/fwlink/?LinkId=527962
for information on understanding and handling optimistic concurrency exceptions.
再上代碼
public int Add(BannerView bannerView) { try { //sysBanner.ImgUrl = sysBanner.ImgUrl.Contains("http") ? sysBanner.ImgUrl : _programConfig.AliYunOSSUrl + sysBanner.ImgUrl; //sysBanner.CreateDate = DateTime.Now; _banner.Add(new SysBanner { Content = bannerView.Content, CreateDate = DateTime.Now, Del = (int)bannerView.Del, ImgUrl = bannerView.ImgUrl.Contains("http") ? bannerView.ImgUrl : _programConfig.AliYunOSSUrl + bannerView.ImgUrl, Operation = "", Sort = bannerView.Sort, SrcUrl = bannerView.SrcUrl, Title = bannerView.Title, Type = (int)bannerView.Type, //MaterialId = 0, //Parameter = 0, //ShareType = 0 }); return _banner.SaveChanges(); } catch (DBConcurrencyException ex) { throw; } }
/// <summary> /// 新增一條資料 /// </summary> /// <param name="model"></param> public void Add(TEntity model) { var entity=_dbSet.Add(model); } public int SaveChanges() { return _dbContext.SaveChanges(); }
代碼特別簡單,就是新增一條資料,進行儲存,完全沒複雜的東西。
出現並發異常,整個人是蒙逼狀態。
單人進行調試,新增一條資料,自增ID,不存在多使用者同時操作,怎麼可能出現並發?
即使出現並發,主鍵也是自增ID,只會出現多條資料,也不可能是並發異常……並且多個業務模組,其他模組的新增完全是正常的。
這又是為什麼!!!!
首先就是審視代碼,確定沒問題……檢查依賴注入,沒有問題……檢查ef產生的sql,沒有問題……閱讀官方文檔,沒找到原因……去群裡向各位朋友請教,還是無法解決。
官方文檔有一個DBConcurrencyException處理並發異常的,是基於修改和更新的,經實驗,無法解決。
一步一步調試,源碼調試,找到幾處疑點,經排查都不是引起新增並發的bug。
重新dbfrist產生model實體,無法解決……刪除表,重建表,無法解決。
似乎走進了死胡同,園子裡博問發貼,也沒有解決。整個排除過程,說起來都是淚。
後來就在想,既然底層調用方法都是一樣的,那唯一不一樣的就是儲存的實體,會不會是表結構導致的?
經過對比出現異常的表與正常的表結構,發現一個不同點,裡面有幾個欄位設定了預設值,還有兩個非null欄位,而正常操作的那些實體裡是沒有的。
嘗試取消預設值後,再注釋掉dbFirst產生的一行代碼HasDefaultValueSql("xxx"),再一運行,居然成功了!!!
難道是ef core mysql的bug?表不能設定預設值?這似乎不合道理,產品發布這麼久了,很多人已經用在生產環境了,不可能出現這麼低級的錯誤吧?
在園子裡博問發貼時,有位園友向我說,預設值的欄位,要加.HasDefaultValue()。這種是code first時加的,而我用dbFirst時自動產生的是HasDefaultValueSql("xxx")。
難道是調用函數不同而產生的bug?
經過多次實際測試,資料庫設定預設值及非null欄位是沒有問題的。
問題出在db first產生實體時時自動加的這行代碼上HasDefaultValueSql("xxx"),只需要注釋掉這些代碼,運行就正常。
.HasDefaultValue()一樣會引起新增並發異常,原因未知。
asp.net core 2.0
ef core mysql
pomelo.entityFrameworkCore.mySql
如果有朋友遇到類似問題,可以做為參考。
至於為什麼不能用HasDefaultValueSql("xxx")及.HasDefaultValue(),目前正在研究中,有新發現,會更新文章。
asp.net core ef core mysql 新增資料並發異常處理