2016-08-03 28 views
0

我在很長一段時間遇到問題。讓我們想象這個例子:Microsoft.EntityFrameworkCore.dll中發生類型爲「Microsoft.EntityFrameworkCore.DbUpdateException」的異常。

public class Coordinate { 

    public int id {get;set;} 
    public int x {get;set;} 
    public int y {get;set;} 
} 
public class Planet { 

    public int id {get;set;} 
    public string name {get;set;} 
    public Coordinate coordinate {get;set;} 
} 

我已經創建了兩個模型,並且模型Planet具有模型座標作爲屬性。 現在想象一下代碼中的某處,我創建了一個座標,並將其存儲在數據庫中。 想象這是座標:

Coordinate c = new Coordinate(); 
c.x = 1; 
c.y = 2; 

然後我把它添加到我的數據庫,並將其保存。

但是,當我創建一個星球,我做的:

planet.coordinate = c; 

然後我試着將它添加到數據庫中,我有以下錯誤:

An exception of type 'Microsoft.EntityFrameworkCore.DbUpdateException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code

Additional information: An error occurred while updating the entries. See the inner exception for details.

我知道我可以改變屬性public Coordinate coordinatepublic int coordinate_id但我想用座標模型來代替。

我使用ASP NET CORE 1.0

Cumps

+0

「詳情請參見內部異常。」那麼它說什麼? – DavidG

回答

1

你的問題是,在這一點上,c已經有一個Id。

隨着planet.Add,行星和附加到它的所有座標將被設置爲在您的DbSet中添加,並且在調用SaveChanges時,將創建插入語句。 (這裏我假設你的列和你的Id屬性是一個自動增量)

當SaveChanges完成時,EF將會看到這個星球在數據庫中,但剛添加的座標的Id是不同的(它被DBMS ,所以現在座標在你的數據庫中有兩次,有兩個不同的ID),所以它會預料到出了問題並拋出這個異常。

當你沒有重複的條目問題,將ID設置爲空,否則還是0,有兩種解決方案:

- 設置只有FK財產,而不是導航屬性

- 呼叫的SaveChanges只有一次(例如,剛纔添加的星球,但是添加了協調關係修正應該導致同樣的結果)

+0

我剛剛意識到:通過將c的EntityState設置爲EntityState.Modified,還有第三種解決方案。 – DevilSuichiro

+0

我喜歡第三種解決方案,所以當添加星球時,我會執行「context.Entry(planet.coordinate).State = EntityState.Modified? –

+0

yes。但是,現在我想到了,這隻會避免DbUpdateConcurrencyException和重複的條目。我認爲在你的代碼中有另一個拋出DbUpdateException的錯誤,你應該看看InnerException。 – DevilSuichiro

0

在看看內部異常會給你什麼錯誤的更多詳細信息。

要做到這一點,在調試模式下,當異常顯示。單擊查看詳細信息並按照樹直到找到內部異常。

可能存在重複行,主鍵問題或結構問題。

+0

這並沒有回答這個問題,它只給出了調試建議。 – DavidG

+0

我明白大衛,但低代表。我無法評論...所以我該怎麼做。 – mt025

+0

[去賺取50代表](http://stackoverflow.com/help/whats-reputation),它不需要很長時間。你可以通過對問題進行編輯來做到這一點,其中有很多需要格式化幫助。 – DavidG

相關問題