asp.net core ef core mysql 新增資料並發異常處理

來源:互聯網
上載者:User

標籤: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 新增資料並發異常處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.