0

同様の問題があります。

同じトランザクション スコープで 2 つの挿入を行いたいです。オブジェクトは関連しており、それらの間に FK 関係がありますが、いくつかの理由から、ナビゲーション プロパティを介してそれらを接続するのではなく、ID によってのみ接続したいと考えています。

これは、私が達成したいことを単純化したものです。

Order o = new Order();
OrderDetails d = new OrderDetails();
new Repository().SaveNew(o, d);

class Repository{

void SaveNew(Order o, OrderDetails d){
  using (TransactionScope transaction = new TransactionScope())
  {
   _context.Connection.Open();

   // order
   _context.Orders.ApplyChanges(o);
   _context.SaveChanges();

    // details
    d.OrderID = o.ID;
    _context.OrderDetails.ApplyChanges(d);
    _context.SaveChanges(); <--- UpdateException

    _context.Connection.Close();
    transaction.Complete();
  }
 }
}

問題は、FK 評価が失敗したために UpdateException が発生することです。FK 関係を削除して、まったく同じコードを実行しようとしたところ、問題なく動作し、両方のオブジェクトに適切なプロパティが設定されていました。では、なぜこのアプローチは失敗するのでしょうか? そして、これはどのように行うべきですか?繰り返しますが、ナビゲーション プロパティを介してエンティティをアタッチしたくありません。

ありがとうございました!

4

2 に答える 2

0

これをテストするための開発環境を実行していませんが、起こっていると思うのは次のとおりです。

IDがデータベースで生成されていると仮定します。注文を保存した時点では、IDはわかりません。

次に、注文詳細の注文IDが注文のIDに設定されますが、注文はデータベースから再ロードされませんでした。値は0だと思います。

FKが0の注文詳細を保存しようとすると、エラーが発生します。

EFが自動的に機能するように両方を同時に保存するか、注文をリロードします。

于 2010-10-01T21:52:20.200 に答える
0

FK リレーションシップはデータベースに残しますが、AssociationSet と Association は SSDL から削除します。デザイナーではこれを行うことができません。XML を手動で編集する必要があります。

私はEF 4ところで使用しています。

次に、SaveNew メソッドで AddObject と SaveChanges を使用して、最初の (親) オブジェクトを追加します。子に外部キー プロパティを設定し、AddObject と SaveChanges で追加します。

于 2010-10-01T21:21:36.240 に答える