2

私は .NET4.5/EF5 を使用しており、既存のデータベースからモデルを作成しました。

私は次のコードを使用しています:

Order currentOrder = new Order();
using (var db = new ILSEntities())
{
    try
    {
        Event currentEvent = db.Events.OrderByDescending(u => u.EventID).FirstOrDefault();
        currentOrder.Event = currentEvent;
        db.Orders.Add(currentOrder);

        db.SaveChanges();

そして、見つけた Event オブジェクトの重複レコードが作成されていることがわかりました。これは、私が望んでいたことではありません。

同様の問題に関連する多くの投稿を読みましたが、外部キー関係の2つの参加者のコンテキストが異なります。ここでは、1 つを見つけるために使用したのと同じコンテキストで保存しており、もう 1 つのオブジェクトは新しいオブジェクトです。

私も試しました:

currentOrder.Event.EventID = currentEvent.EventID;

しかし、それは失敗し、Event オブジェクトの他のメンバーの値が必要であることを伝える EF 検証エラーが表示されます。

また、オブジェクトを追加した後、複製されるオブジェクトの を などに具体EntityState的に設定しようとしましたが、以前は成功しませんでした。DetachedModifiedOrderSaveChanges

これは基本的な問題だと思いますが、困惑しています

4

2 に答える 2

2

私の理解では、エンティティがデータベースに既に存在することをエンティティフレームワークに納得させるために、それらの間の関係を割り当てる前に、親オブジェクトと子オブジェクトの両方がコンテキスト内にある必要があります。AddObject メソッドを使用する必要がある新しいオブジェクトを追加するには、Add() メソッドを使用してエンティティ間の関係を確立します。あなたのコードでcurrentOrderは、コンテキストにありません。同じコンテキストでフックしてから、リレーションを割り当ててみてください。コードは次のようになります。

Order currentOrder = new Order();
using (var db = new ILSEntities())
{
    try
    {
        Event currentEvent = db.Events.OrderByDescending(u => u.EventID).FirstOrDefault();
        db.Orders.Attach(currentOrder); //attach currentOrder to context as it was not loaded from the context
        currentOrder.Events.Add(currentEvent);//establish relationship

       db.ObjectStateManager.ChangeObjectState(currentOrder, EntityState.Added);

        db.SaveChanges(); 
}
}
于 2012-09-23T23:45:00.363 に答える
2

わかりました、私は最終的にこれを理解しました、そしてそれは私のせいでした.

問題は、Order オブジェクトが別のテーブル Shipments に FK され、このテーブルが Events にも FK されていることです。問題は、Shipment オブジェクトの Event 参照が新しいレコードの原因であったことです。解決策は、これらの関係をすべて同じコンテキスト内に追加することで、EF にこれらの関係を知らせることでした。

オブジェクト グラフを組み立てるコードは、多数の Web フォームに分散されており、ここでの応答により、一歩下がって全体を批判的に見ることができました。

于 2012-09-24T06:56:27.323 に答える