1. 程式人生 > >EntityFrameWork使用TransactionScope分布式事務,存儲區更新、插入或刪除語句影響到了意外的行數(0)。實體在加載後可能被修改或刪除。刷新 ObjectStateManager 項 錯誤

EntityFrameWork使用TransactionScope分布式事務,存儲區更新、插入或刪除語句影響到了意外的行數(0)。實體在加載後可能被修改或刪除。刷新 ObjectStateManager 項 錯誤

bject require 鍵值 有一個 char 加載 ransac state system

最近在開發一個小型的物業管理系統,系統其中有一個功能需要每個月按抄的水表、電表等生成相應的費用,數據庫主要的基礎數據表有大樓水、電表、樓層水、電表、房間水電表;其中大樓和樓層的水電表是用於計算公攤的;系統設計有一個費用的統計表,表名ChargeAccountMaster,表內設計的有一個字段ID,主鍵 、 自增長;計算時由於是數據核算統計,所以引入事務計算數據的同時,也會把相應計算的結果回寫回基礎數據表中,計算的類是service層,框架的ORM用的是EF,就沒有采用本地事務,采用了分布式事務TransactionScope,代碼如下:

            TransactionOptions transactionOption = new TransactionOptions();

            //設置事務隔離級別
            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            // 設置事務超時時間為120秒
            transactionOption.Timeout = new TimeSpan(6000000000);
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                 .....................業務代碼
                  scope.Complete();
   
         }  

 最初數據統計寫入數據庫的場景是,先初始化ChargeAccountMaster 表,對表內的每一個字段的值都進行初始化,插入數據庫;然後在計算和統計每一個基礎數據表後得出結果再Update該表,在開發的時候,這種方式一直沒有出錯,直接發布到生產環境,將正式的數據導過來,進行大查的數據核算時結果報錯了:存儲區更新、插入或刪除語句影響到了意外的行數(0)。實體在加載後可能被修改或刪除。刷新 ObjectStateManager 項 ;剛見到這個錯誤時,頭都大了,沒有任何的提醒,只好找度娘,找到如下答案:

主鍵沒有賦值,造成數據庫的值與程序的主鍵值的ID沒有對應上

通過調試,由於數據庫的ID設計為自增,所以在程序時中就沒有直接賦值,跟蹤到數據插入,發覺自增的ID在EF 第一次 SaveChange()後,是有返回ID的,且插入數據是成功的,但由於數據的錯誤,事務卻未能提交;但第二就插入不成功,就開始報這個錯誤了。

一直以為大家都寫的ID沒值,剛好第二次確實沒有返回值,一直以為就是ID的問題,就在這上面花了很多時間,調整事務的隔離屬性、範圍內、把自增的ID改為程序生成寫入都沒有效果,還是報同樣的錯誤;最後沒辦法,在想第一交都有值,那麽只做一次性插入,不做前面的初始化,初始化的動作在程序上做,每計算完一個基礎數據然後直接在程序上更新,最後統一插入和更新數據庫,結果卻成功了,問題解決了,卻找不到出現問題的原因。

個人分析:事務是不是在插入數據後(SaveChange),不允許再對當前的數據進行更新,那麽為什麽在開發的時候,卻沒有了出現這個問題?

將問題記錄在這,找到問題的原因再來更。。。。。。

EntityFrameWork使用TransactionScope分布式事務,存儲區更新、插入或刪除語句影響到了意外的行數(0)。實體在加載後可能被修改或刪除。刷新 ObjectStateManager 項 錯誤