2012-05-21 48 views
1

我正在使用實體框架4(使用自我跟蹤實體)並訪問視圖,即合併兩個表。因此,當我更新視圖的信息時,我將視圖的STE發送到訪問數據庫的存儲庫。將視圖轉換爲表並保存更改讓我感到樂觀併發異常

我也做了以下內容:

當我收到我的看法與更新的信息,創建我STE1和STE2。當我創建一個STE時,如何創建一個添加狀態。所以我怎麼知道STE的狀態被修改,我用方法MarkedAsModified來改變我的兩個STE的狀態。

然後,我如何在視圖的STE視圖中獲得兩個表的信息,我將視圖中的信息傳遞給正確的STE,並將STE的更改應用到objectContext

最後我做了saveChanges。但在這一步我收到Optimistic concurrency exception。我認爲這是因爲STE從狀態傳遞到AddedModified,因此上下文檢測到創建和SaveChanges之間存在一些修改,但我也嘗試在STE中嘗試AcceptChanges,稍後將其標記爲已修改,並應用更改最後SaveChanges,但問題仍然存在。

我該如何解決問題?有更好的方式來處理view和Entity Framework v4?

謝謝。 Daimroc。

編輯1:我仍然有問題。我的代碼如下:

組件myComponent = new Components(); //這是一個STE myComponent.Rereference = myView.Reference; ... //其他屬性 myComponent.MarkedAsModified(); //這是需要的,因爲我想更新信息,不需要添加新的寄存器。 myContext.ApplyChanges(「Components」,myComponent); miContexto.SaveChanges();

在saveChanges中,我收到異常:更新,插入或刪除語句影響了意外數量的行(0)。自實體加載後,實體可能已被修改或刪除。刷新ObjectStateManager條目。

這是問題所在?我可以不修改創建的新STE嗎?

謝謝。

+1

你能否提供代碼塊,以便我們看到你在做什麼? –

回答

1

我找到了解決問題的方法。

在第一個解決方案中,解決方案是查詢數據庫以獲取數據庫中現有的寄存器。這將在上下文中添加實體,然後可以修改數據並正確保存更改。

但後來,我找到了避免使查詢成爲數據庫以在上下文中添加已修改實體所需的方法。

的方法是使用以下代碼:

Customers myCustomer = new Customers { IDCustomer = myCustomer.IDCustomer }; 
myContext.Customers.Attach(myCustomer); 

//update the data of the entity. 

myContext.SaveChanges(); 

的解決方案是創建一個新的實體設置的主鍵。如果實體具有FK,它將以相同的方式表示。此時,該實體具有添加狀態。

後來,是附加到上下文,然後可以修改。當字段改變時,實體將其狀態更改爲修改狀態,所以當調用saveChanges()時,EF更新實體,而不是嘗試添加新實體。

我在link找到這個信息。在這篇文章中,解決方案是刪除一個實體而不將其檢索到數據庫,如果我們想要修改一個現有的寄存器,這個想法也可以工作。

+0

這是一個部分解決方案,我想使用STE並可以使用markedAsModified,然後將更改應用於上下文。 –