0

我正在使用MVC4與實體框架4.1。樂觀併發異常由用戶代碼處理

最初我們從數據庫創建了一個Ado.net實體模型。在.edmx文件中,數據庫中的某些表不可見,因爲它們不具有特定表上的主鍵。

隨着我們的項目向前發展,我們需要更新到沒有主鍵字段的日誌表格之一。

因此,我們修改了.edmx文件,而不是在數據庫中進行修改。我們的客戶要求我們不要修改數據庫字段。我們修改了.edmx並在表中的一個現有字段上創建了一個pk(例如tbl_log表)。

我們正在嘗試更新tbl_log。但它給出了一個錯誤信息:Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

我已經看到了堆棧溢出中的很多問題,並且搜索了一下,但找不到任何解決方案。

即使我試過刷新ObjectStateManager條目,但它仍然指向相同的錯誤。

這裏是我的代碼

tbl_log log = new tbl_log(); 

        Entity.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified); 

    log.LoginId = strLoginId; 
    log.Password = strPassword; 
    log.IPAddress = strIpAddress; 
    log.Date_Time = DateTime.Parse(DateTime.Now.ToString()); 
    log.sessionId = new Guid(strSessionId); 

    Entity.AddTotbl_log(log); 

Entity.SaveChanges();// optimistic concurrency error 

請幫

感謝,

KARTHIK

回答

0

你的模型必須代表數據庫模式。如果你添加一個PK到模型中,它也應該存在於數據庫中,否則你會得到錯誤。即使表是審計日誌表,在任何表上都沒有PK也是一種不好的做法。

異常告訴你的是,對象跟蹤器無法確定自上次調用數據庫以來對象的狀態是否已更改。這是因爲即使在框架發送了插入/更新查詢之後,您設置的PK仍然爲0。

不幸的是沒有好辦法解決這個問題。我會建議(正如我認爲的微軟一樣)爲數據庫中的每個表添加一個主鍵列。

編輯 - 從評論

隨着PK用於跟蹤對象,如果你已經設置了PK有身份的模型中的StoreGenerationPattern將期待值也被更改。當它不改變時,它會拋出你所看到的錯誤。嘗試將StoreGenerationPattern更改爲None,因爲EF不會期望您的虛假PK發生更改

+0

我已經爲數據庫中已存在的列添加了PK。但是在數據庫中沒有爲該列定義PK。 –

+1

PK用於跟蹤對象,所以如果您已經在模型中將PK設置爲具有Identity的'StoreGenerationPattern',則會期望值被更改。當它不改變時,它會拋出你所看到的錯誤。嘗試將其更改爲「無」,因爲EF不會期望您的人造PK發生變化。 –

+0

+1謝謝Ryan Amies,在模型 –

相關問題