2009-06-17 31 views
14

Entityフレームワークを使用する方法を学習しようとしていますが、解決できない問題が発生しました。 私がやっていることは、私が持っている映画のリストを歩いていて、それぞれを単純なデータベースに挿入していることです。私は私が読んで()db.SaveChangesで例外を取得し、これを行うと .NET EntityフレームワークでSaveChangesを呼び出すときにInvalidOperationExceptionが発生する

この

は私が
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(); 
} 

を使用しているコードです。データベースへ

変更が正常にコミット あったが、オブジェクト コンテキストを更新中にエラーが発生しました 。 ObjectContextが に矛盾した状態である可能性があります。内部例外 メッセージ:オブジェクトのキー値 が ObjectStateManager内の別のオブジェクトと競合するため、AcceptChangesは続行できません。 AcceptChangesを呼び出す前に、 のキー値が一意であることを確認してください。

私はこの問題の原因を見つけることができませんでした。 私のデータベーステーブルには3つの列が含まれてい
Idをint型の自動インクリメント
名前NCHAR(255)
パスNCHAR(255)

アップデート:私は私のEDMXファイルとSSDLセクションがStoreGeneratedPattern = "アイデンティティ" としてを持ってチェック 提案する。私はブログのポストに続き、CSAにClientAutoGenerated = "true"とStoreGenerated = "true"を追加しようとしました。これにより、コンパイルエラーが発生しました(エラー5: 'ClientAutoGenerated'属性は使用できません)。ブログ投稿は2006年のもので、フォローアップの投稿へのリンクがあるので、変更されていると思います。

しかし、msdnアカウントが必要なので、フォローアップ投稿を読むことはできません。

+1

私の答えは、プロパティの[StoreGeneratedPattern = "Identity"]を設定することでした[詳細はこちら](http://www.matthewedmondson.info/2012/09/entity-framework-and。 html)。 –

+0

また、INSERT、UPDATE、DELETEにSotredProcedureマッピングを使用し、IDキーがSP内で計算されたキーである場合に発生します。 –

答えて

10

私はこの解決策を見つけました。

私のテーブルを作成したときに、主キーを追加して(アイデンティティ)プロパティをyesに設定するのを忘れてしまったということが起こりました。私はエンティティモデルを作成し、このエラーが発生しました。

私は戻ってデータベーステーブルを修正しましたが、私はまだ奇妙な例外を抱えています。最終的に問題を解決したのは、エンティティを削除して、テーブルが修正された後でエンティティを再作成することでした。

はありません複数の例外:)

6

この例外は、Id列の重大な行に等しい値を持っていることを示しています.Id列はキー列であるため一意の値しか持たないと考えられます。 Entity Frameworkは、このような列を2つの方法で処理できます。ユーザー(クライアント)が一意の値を生成するか、サーバーが一意の値を生成するかのどちらかです。あなたのケースでは、サーバーが自動インクリメントキーを生成できるようにするのが理にかなっています。

SSDLファイルのId列にStoreGeneratedPatternキーが設定されていますか?ここで

this blogpostからの例です:

<EntityType Name="rooms" Key="id"> 
    <Property Name="id" Type="int" Nullable="false" 
       StoreGeneratedPattern="Identity" /> 
    <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" /> 
</EntityType> 
+0

EF4では "identity"の代わりに "Identity"です –

+1

@XMLforDummies:ありがとう、答えを更新しました! –

+0

ありがとう!この問題は、先週のように私を苦しめています。私は手動でファイルを編集しなければならなかった。プロパティでそれを変更すると注釈マークが追加されました。 – Htbaa

1

あなたは束縛のBindingSourceを持っている場合、あなたはsuspendbindingを呼び出す必要があります:

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

最後の時間は、私は次のコードを試してみました、私はそれが

正常に動作していると述べました
bs.SuspendBinding(); 
Data.SaveChanges(); 
bs.ResumeBinding(); 

私が今日あなたに伝える重要なことは次のとおりです。

1-上記のコードを使用してバインディングを中断した場合、コレクション内で失われたインデックスやマスターディテールバインディングなどの多くのシナリオを修正するためのコードを追加する必要があります

2-コードの上に私はこれがあなたの同様の問題

+0

注:System.Data.Objects.SaveOptions.Noneは.NET 4.0でのみ使用できます。 – sfuqua

+1

それは.Net 4.0だけかもしれませんが、SaveOptions.Noneはこの同じ問題で素晴らしい仕事をしました。 –

+0

EF5または6で何を使用しますか?同等のオプションがありますか?同じ問題が出ていますか?ありがとう – lawphotog

2
System.Data.Objects.SaveOptions.None 
友人ありがとう解決を願って、私たちは、例外がなくなっ表示され、必要がより多くのコード

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

を書かないためにどこすべてのものは大丈夫だろう

これは問題を解決しますが、私はnoneまたは他のオプションのuningの違いは何ですか?

0

チェック主キーは、あなたのetitiesのいずれかに不足している場合、 そうならば、それらを作成し、「データベースからのUpdateModel」を行う

あなたが設定されている場合、これは問題に

0

を解決する必要があります。またチェック別の列の「Is Identity」プロパティを「yes」に設定し、重複した値を挿入します。

0

oracle 12C Auto-IDのトリガーを使用して、Customer-> Order-> Order-Detailsの3つのレベルにまたがるテーブル関係で同様の問題が発生しました。 SaveChanges()を使用して挿入するとSystem.InvalidOperationExceptionが投げられました。

ソリューション:拡張機能SaveChanges(System.Data.Objects.SaveOptions.None)は、システムがオブジェクトグラフの状態で一時的なEntityKeysを使用するのを防ぎ、結果の例外が回避されます。

+2

これは質問の答えではありません。あなたと同じような問題がある場合は、別の質問を投稿するかもしれません。 [良い答えを書く方法](http://stackoverflow.com/help/how-to-answer)を参照してください。 –

関連する問題