0

私は MVC3 アプリケーションに取り組んでおり、Oracle データベース (11G R2) にリンクされた Entity Framework を使用しています。内で単一のオブジェクト コンテキストを使用しようとすると、問題が発生しますTransactionScope

コードは次のとおりです。

using (TransactionScope scope = new TransactionScope())
{
    using (Entities context = new Entities())
    {
        // Right insert
        T_RIGRIGHT entity1 = new T_RIGRIGHT()
        {
            RIGCODE = "test1",
            RIGINSERTLOGIN = "aco",
            RIGINSERTDATE = DateTime.Now,
            RIGUPDATELOGIN = "aco",
            RIGUPDATEDATE = DateTime.Now
        };

        context.AddToT_RIGRIGHT(entity1);

        context.SaveChanges();

        // Right/Profile insert
        T_RIPRIGHTPROFILE entity2 = new T_RIPRIGHTPROFILE()
        {
            PROID = 3,
            RIGID = entity1.RIGID,
            RIPINSERTLOGIN = "aco",
            RIPINSERTDATE = DateTime.Now,
            RIPUPDATELOGIN = "aco",
            RIPUPDATEDATE = DateTime.Now
        };

        context.AddToT_RIPRIGHTPROFILE(entity2);

        context.SaveChanges(); // SaveChanges fails due to the FK constraint on table 
    }

    scope.Complete();
}

コードを説明しましょう...

まずentity1T_RIGRIGHT要素と呼ばれるエンティティを作成します。T_RIPRIGHTPROFILE以前に作成した T_RIGRIGHT 要素の ID を使用する要素をインスタンス化します。

実行は 2 番目に失敗しcontext.SaveChanges()、例外はテーブルの外部キー制約に関するものですT_RIPRIGHTPROFILE( が必要T_RIGRIGHTです)。

私の説明が十分に明確であることを願っています

それを機能させる方法はありますか?

PS : 英語は私の母国語ではないため、申し訳ありません。

4

1 に答える 1

1

entity1.RIGIDDBにコミットされていないエンティティのFKを割り当てようとしています。

RIGID = entity1.RIGID,

entity1をよく見ると RIGID、デフォルトでは0であることがわかります。代わりに、FK関係を表すナビゲーションプロパティを設定する必要があります。

RIG = entity1,

これにより、EFはこれらのエンティティを適切に関連付けることができます。このentity1はまだDBにコミットする必要がないため、追加のSaveChanges()呼び出しも必要ありません。

また、シナリオでは、必要はありませんTransactionScope-EFはすでに内部でトランザクションを使用していますSaveChanges()-提案された変更に基づいて、1回のSaveChanges()呼び出しのみが必要であるため、外部トランザクションスコープは必要ありません。

于 2011-09-12T15:59:57.223 に答える