2011-12-19 4 views
1

私はあなたが私を助けてくれることを願っています。私はこのバグがどこに残っているかを把握しようと、一晩中頭を悩ましています。Entity.SaveChanges()は、BindingListの削除されたオブジェクトも保存しますか?

私はwinformで請求書作成アプリケーションを作成しています。

データソースがBindingListオブジェクトに設定されたフォーム上にグリッドがあります。

BindingList<InvoiceLine> MyInvoiceLines = new BindingList<InvoiceLine> { }; 

Invoice MyInvoice = new Invoice(); 

InvoiceLineと請求書の両方が私のモデルでは、エンティティオブジェクトです:

はちょうどそれはの線に沿ってみましょう。

私は経由してグリッドに行を追加します。

LineToBeRemovedは使用を削除したいときに選択した行を取得するプロパティです
MyInvoiceLines.Remove(LineToBeRemoved); 

:私は経由グリッドから行を削除

MyInvoiceLines.Add(new InvoiceLine()); 

ラインなど...

結局私は請求書を保存するので、私はこれを行います。

foreach(var line in MyInvoiceLines) 
{ 
    MyInvoice.InvoiceLines.Add(line); 
} 

を呼び出し、SaveChange()を呼び出します。しかし、InvoiceLines BindingListから削除された行も保存されています...私は頭を傷つけています。私のコードでは、最初から最後まで、InvoiceLinesコレクションは参照されるか、データコンテキストこのメソッドの前にオブジェクトがあり、最終的には保存を行います。

これは私のコードを簡略化したものですが、BindingListまたはデータコンテキストオブジェクトのどちらかで概念的に間違っているものがあると考えるのは難しいです。私がノブなので、本当に私には明らかではありません。

すべてのヘルプではなく、修正後、私はさらに、この問題を診断することができますおそらくいくつかのツールや方法をいただければ幸いです...

アップデート:するBindingListに追加する前に、アイテムを取り外し、一見固定はなく、エンティティからオブジェクトを削除すると、奇妙な動作が発生します。

+2

コードを投稿し、エラーの発生場所と条件を教えてください。 –

+0

申し訳ありませんが、私はあまりにも早く提出しました。私はOPを更新しました。詳細が必要な場合はお知らせください。 – Rillanon

+0

'MyInvoiceLines.Remove(LineToBeRemoved)'が実際に動作し、foreachループの 'MyInvoiceLines'に実際に削除されたアイテムが含まれていないことを確認しましたか? – Slauma

答えて

0

BindingListから削除されたエンティティも、DBContextから分離されていますか?

エンティティがまだコンテキストにアタッチされている場合でも、エンティティは追跡され、変更が保存されます。

+0

私はentity.InvoiceLines.detach(LineToBeRemoved)を呼び出そうとしましたが、それでもまだ保存されています...実体はセーブメソッドの前にアタッチされることは決してありませんでした。この前に削除方法が発生します。 – Rillanon

0

変更されていないレコードに対して1つのダーティーフラグを設定してからEntity.SaveChages()イベントでチェックする必要があると思います。 この手助けがあります...

+0

ありがとう、あなたはちょっと精巧にできますか?すみません、私はノブです。 – Rillanon

1

オブジェクトを明示的に削除してみることもできます。すなわち、

foreach(var object in deletedObjectCollection) 
{ 
    _currentContext.DeleteObject(order); 
} 

削除を有効にするコレクションには依存しないでください。私の経験では(EF4で)うまくいきません。私は遅延読み込みを使用しています。コレクションにオブジェクトが存在しない場合、読み込まれていないために存在しない可能性があります。これを行うには(おそらく)よりエレガントな方法がありますが、現在私のために働いています。

一般的に私は私よりもEFでもっと明示的にやらなければなりませんでした。

+0

私は明示的に削除しようとしましたが、削除されたオブジェクトが追加され、非削除されたオブジェクトが削除されました。 – Rillanon

+0

Oh no @Rillanon。 2つのコレクションを作成し、正しいコレクションを削除していますか?明らかです - 申し訳ありません。また、 - きれいではありませんが、各削除後にsaveChangesを呼び出してみてください。削除オブジェクトの呼び出しは、 –

+0

を働かなければならないちょうどもう一度チェック... 1つのコレクションではなく、これは私の頭をやっている:(ああ、ベッド、夜の夜のための時間。誰もが助けてくれてありがとう! – Rillanon

0

これを複数回実行しますか? InvoiceLineアイテムをInvoiceに追加してから、BindingList(実際のエンティティではありません)のアイテムを削除してから、エンティティに再追加することができます。

私は、主キーが一致するので、(この点について少しは確信していますが)重複は2回保存されないと思います。しかし、削除されるはずのアイテムはまだそこにあります。

0

InvoiceオブジェクトがEntityオブジェクトの場合は、コンテキストを認識し、コンテキストによって追跡されます。 SaveChanges()を呼び出すと、すべてのEntityオブジェクトのすべての変更がデタッチされない限り、すべての変更が保存されます。

これらのオブジェクトをオブジェクトグラフに関連させ、オブジェクトグラフの任意のノードをコンテキストに添付すると、グラフ全体がアタッチされることに注意してください。あなたはInvoiceLineのように、新しいエンティティオブジェクトを作成し、そしてあなたがオブジェクトグラフにこの新しいInvoiceLineを関連付けるのであれば:

MyInvoiceLines.Add(new InvoiceLine()); 

グラフ全体は、この時点でコンテキストによって追跡されなければなりません。

関連する問題