0

このコードは機能します:

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

しかし、なぜ私ができないのか理解できません:

db.Attach(t);
db.DeleteObject(t);
db.SaveChanges();

私がそれを試してみると、次のようになります:

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

私は最初にEF 5.0モデルを使用しています。これがedmxダイアグラムの一部です:

ここに画像の説明を入力

理解に苦しむので、どなたか教えてください。

更新 1 (Boomer の提案による):

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

戻り値 :

ObjectStateManager で見つからなかったため、オブジェクトを削除できません。

4

1 に答える 1

1

この関係では顧客が必要であるため、エラーは明らかです。CustomerIDを指定せずにデータベースにTrailerレコードを挿入しているようなものですが、SQLで挿入できますか?

より良いアプローチは、たとえばIDでそのオブジェクトを削除することです。その場合、t削除する前に添付する必要はありません。

using (var db = new CAPSContainer())
{   
    db.DeleteObject(db.Trailers.Where(p => p.ID == t.ID));
    db.SaveChanges();
}

Trailersまたは、 (ドロップダウン内で)すべてをロードするときに、 Customerwithとその他の必須エンティティも添付する必要があります。

于 2012-12-07T10:30:00.183 に答える