簡體   English   中英

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

[英]InvalidOperationException when calling SaveChanges in .NET Entity framework

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

這是我正在使用的代碼

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() 處得到一個異常。

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

我一直無法找出導致此問題的原因。 我的數據庫表包含三列
Id int 自增
名稱 nchar(255)
路徑 nchar(255)

更新:我檢查了我的 edmx 文件,並且 SSDL 部分具有建議的 StoreGeneratedPattern="Identity"。 我還關注了博客文章,並嘗試按照那里的建議在 CSDL 中添加 ClientAutoGenerated="true" 和 StoreGenerated="true"。 這導致了編譯錯誤(錯誤 5:不允許使用 'ClientAutoGenerated' 屬性。)。 由於這篇博文是 2006 年發布的,並且它有一個指向后續文章的鏈接,我認為它已經被更改了。

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

我找到了解決方案。

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

我回去修復了我的數據庫表,但我仍然有奇怪的異常。 最后解決問題的方法是把實體去掉,等表修好了再重新創建。

沒有更多的例外:)

上次我嘗試了以下代碼,我說它工作正常

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

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

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

2-如果我們使用下面的代碼而不是上面的代碼,我們會看到異常消失了,一切都會好起來的,不需要寫更多的代碼

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

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

謝謝你的朋友

此異常似乎告訴您您在 Id 列的幾行中具有相等的值,該列應該只有唯一值,因為它是一個鍵列。 實體框架可以通過兩種方式處理此類列:您(客戶端)生成唯一值,或者服務器生成唯一值。 在您的情況下,允許服務器生成自動遞增的密鑰似乎是合乎邏輯的。

您是否為 SSDL 文件中的 Id 列設置了StoreGeneratedPattern鍵?

這是 這篇博文中的一個例子:

<EntityType Name="rooms" Key="id">
    <Property Name="id" Type="int" Nullable="false" 
              StoreGeneratedPattern="Identity" />
    <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" />
</EntityType>
System.Data.Objects.SaveOptions.None

這解決了問題,但我想知道 uning none 或其他選項之間有什么區別。

如果綁定了綁定源,則應調用掛起綁定:

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

還要檢查您是否將另一列的“Is Identity”屬性設置為“yes”,並且您正在向其中插入重復的值。

我遇到了跨越三個級別的表關系的類似問題,例如客戶->訂單->訂單詳細信息和 oracle 12C 自動 ID 觸發器用於密鑰生成。 使用SaveChanges()插入會拋出System.InvalidOperationException

解決方案:擴充 function SaveChanges(System.Data.Objects.SaveOptions.None)可防止系統在 object 圖的 state 中使用臨時EntityKeys ,從而避免結果異常。

檢查您的實體中是否缺少主鍵,如果是,則創建它們,然后執行“從數據庫更新模型”

這應該可以解決問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM