在.NET實體框架中調用SaveChanges時出現InvalidOperationException

.net c# entity-framework

我正在嘗試學習如何使用實體框架,但我遇到了一個我無法解決的問題。我正在做的是,我正在瀏覽我擁有的電影列表,並將每個電影插入一個簡單的數據庫。

這是我正在使用的代碼

private void AddMovies(DirectoryInfo dir)
{
    MovieEntities db = new MovieEntities();
    foreach (DirectoryInfo d in dir.GetDirectories())
    {
        Movie m = new Movie { Name = d.Name, Path = dir.FullName };
        db.AddToMovies(movie);
    }
    db.SaveChanges();
}

當我這樣做時,我在db.SaveChanges()讀取了一個異常。

已成功提交對數據庫的更改,但更新對像上下文時發生錯誤。 ObjectContext可能處於不一致狀態。內部異常消息:AcceptChanges無法繼續,因為對象的鍵值與ObjectStateManager中的另一個對象衝突。在調用AcceptChanges之前,請確保鍵值是唯一的。

我無法找出造成這個問題的原因。我的數據庫表包含三列
Id int autoincrement
名稱nchar(255)
路徑nchar(255)

更新:我檢查了我的edmx文件,SSDL部分按照建議使用StoreGeneratedPattern =“Identity”。我也跟著博客文章,試圖在CSDL中添加ClientAutoGenerated =“true”和StoreGenerated =“true”。這導致編譯錯誤(錯誤5:不允許'ClientAutoGenerated'屬性。)。由於博客文章是從2006年開始的,並且它有一個後續帖子的鏈接,我認為它已被更改。

但是,我無法閱讀後續帖子,因為它似乎需要一個msdn帳戶。

一般承認的答案

我找到了解決方案。

發生的事情是,當我創建我的表時,我忘了添加主鍵並將(Is Identity)屬性設置為yes。然後我創建了我的實體模型並得到了這個錯誤。

我回去修復了我的數據庫表,但我仍然討厭奇怪的異常。最終解決問題的方法是刪除實體並在修復表後重新創建它。

沒有更多例外:)


熱門答案

上次我嘗試下面的代碼,我說它工作正常

bs.SuspendBinding();
Data.SaveChanges();
bs.ResumeBinding();

我今天告訴你的重要事情是:

1-如果我們使用上面的代碼暫停綁定,我們必須做更多的代碼來修復很多場景,比如集合中丟失的索引和主細節綁定

2-如果我們使用以下代碼而不是上面的代碼,我們將看到異常消失,並且每個東西都可以,無需編寫更多代碼

        Data.SaveChanges(System.Data.Objects.SaveOptions.None);

我希望這能解決你的類似問題

謝謝你的朋友們



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因