0

そうです :

var t = cboTrailer.SelectedItem as Trailer;
using (var db = new CAPSContainer())
{
   db.Attach(t);
   db.Trailers.DeleteObject(t);
   db.SaveChanges();
}

これにより、コンテキストからオブジェクトが削除さtrailerれ、それらの変更がプッシュされます。しかし、それは失敗し、私は得ます:

「CAPSContainer.Trailers」のエンティティは、「CustomerTrailer」関係に参加します。関連する '顧客' が 0 件見つかりました。1 'Customer' が必要です。

問題は、Customers と Trailers の関係が ---> のようなものCustomer 1-* Trailerであることです。したがって、トレーラーを削除しても問題にはなりません。

では、なぜエラーが発生するのでしょうか?

編集:

EF の v4 と 4.4 の両方の dll を試しました。Customer を最初にアタッチすればすべてうまくいくようですが、詳しく調べてみると、エラーは発生していませんが、トレーラーがまだ残っていることがわかります。

var c = cboCustomer.SelectedItem as Customer;
var t = cboTrailer.SelectedItem as Trailer;

using (var db = new CAPSContainer())
{
    db.Attach(c);
    c.Trailers.Remove(t);
    db.SaveChanges();
}

PopulateTrailers();

--> リストにまだ表示されている + アプリを再起動してもまだそこにある...

編集2:

これはほとんど機能します:

            using (var db = new CAPSContainer())
            {
                db.Attach(c);
                db.Attach(t);
                c.Trailers.Remove(t);
                db.Trailers.DeleteObject(t);
                db.SaveChanges();
            }

それは(2回目の削除で)与えます:

同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

私が単一のオブジェクトコンテキストを使用していた直前の同じプロジェクトで..

MyContext.DeleteObject(t)それだけでした。同じ行が 5 行に置き換えられましたが、それでもエラーが発生します。

4

2 に答える 2

2

EF が関係を削除できるように、削除する予告編に関連する顧客を関連付ける必要がある場合があります。

編集

Customer からトレーラーを削除するだけでなく、コンテキストからも削除する必要があります。顧客から削除すると、関係が削除されるだけです。

var c = cboCustomer.SelectedItem as Customer;
var t = cboTrailer.SelectedItem as Trailer;

using (var db = new CAPSContainer())
{
    db.Attach(c);
    c.Trailers.Remove(t);
            db.Trailers.DeleteObject(t);
    db.SaveChanges();
}

PopulateTrailers();
于 2012-12-06T16:19:49.300 に答える
0

cboCustomer のソース要素をロードするとき、トレーラーを含めますか? お気に入り:

cboCustomer.Items = db.Customers.Include("Trailers").ToList();

次に、要素を次のように削除します。

using (var db = new CAPSContainer())
{
    db.Attach(c);
    c.Trailers.Remove(t);
    db.SaveChanges();
}
于 2012-12-06T17:49:30.320 に答える