2009-09-04 1 views
0

私のウェブサイト(C#)でEFを使い始めています。ユーザーはデータを作成または変更することができ、選択画面でデータを作成または変更できます(1ページ)。ユーザーが新しいデータを作成することを選択した場合、私は次のコードを実行します。EF経由でデータベースに新しいデータをコミットする。アタッチ/アペンドでエラーが発生する

Program newProg = new Program(); 
using (DatabaseEntities context = new DatabaseEntities()) 
{ 
Guid id = new Guid(list.SelectedValue); 
var itemString = from item in context.Set where item.Id == id select item; 
Item selectedItem = itemString.ToList()[0]; 
newProg.Items.Add(selectedItem); 
context.AddToProgramSet(newProg); 
context.Detach(newProg); 
} 

かなり多くのユーザーがに提出する準備ができるまで、各ユーザーコントロールに渡される「プログラム」の新しいインスタンスを作成しますデータベース。その時点で次のコードが実行されます:私はそこに着くとき

using (DatabaseEntities context = new DatabaseEntities()) 
    { 
     context.AddToProgramSet(this.SummaryControl.SelectedProgram); 
     context.SaveChanges(); 
    } 

は残念ながら、私は、次のメッセージが表示されます。

それはすでにのEntityKeyを持っているので、オブジェクトがObjectStateManagerに追加することはできません。 ObjectContext.Attachを使用して、既存のキーを持つオブジェクトをアタッチします。この行で

また
context.AddToProgramSet(this.SummaryControl.SelectedProgram); 

、私は前に、前に次の行を追加する場合:

context.Attach(this.SummaryControl.SelectedProgram); 

を、私はこのエラーを取得する:

ヌルのEntityKeyを持つオブジェクト値をオブジェクトコンテキストにアタッチすることはできません。

ご協力いただければ幸いです。ありがとう。

答えて

1

このエラーの根本原因は、すでに主キーが設定されている新しいエンティティとしてエンティティを追加しようとしていることです。

エンティティをいつどの時点でSummaryControlに追加しますか?あなたの最初のコードスニペットを使用すると、エンティティの追加を示しています。

... 
newProg.Items.Add(selectedItem); 
context.AddToProgramSet(newProg); 
context.Detach(newProg); 
... 

を次に、あなたは再びそれを追加するように見える:

using (DatabaseEntities context = new DatabaseEntities()) 
    { 
     context.AddToProgramSet(this.SummaryControl.SelectedProgram); 
     context.SaveChanges(); 
    } 

newProgthis.SummaryControl.SelectedProgramが同じエンティティであれば、あなたはそれを2回追加しようとしました。最初のスニペットからcontext.AddToProgramSet(newProg);を削除し、エンティティで作業してからProgramSetに追加します。

+0

デイブ、応答いただきありがとうございます。私は最初のAddToProgramSet(newProg)をコメントアウトし、以前と同じエラーを受け取ります。 – dangerisgo

+0

私がしようとしているのは、選択ページに行の新しいインスタンス(私の場合はプログラム)を作成し、それをユーザーコントロールに渡し、途中で入力してから最終ページに達すると、ポピュレートされた行を選択し、dbにプッシュします。 – dangerisgo

+0

私はDangerIsGoで働いています。問題は、私たちがエンティティを識別するためにGUIDを使用しているという事実によって引き起こされますか?エンティティにIDの新しいGUIDを与えるように設定されたデフォルトのコンストラクタがあります。それも問題を引き起こしているのでしょうか? –

0

Daveは、その主な原因はエンティティにすでに主キーがあることです。あなたはそれを修正することができ

this.SummaryControl.SelectedProgram 

一つの方法は、あなたが開始する前にデータベースにNEWPROGを保存することである:

Program newProg = new Program(); 

になる:あなたのコードには表示されません

ことの一つは、どのようにアイテムを追加します。

関連する問題