0

特定のビジネス ロジックを実装し、データベースへの「レガシー ユーザー」レコードの追加を処理する、ユーザー テーブルとコード ベース (VB.Net で記述) を備えた既存のデータベースがあります。私が現在取り組んでいるプロジェクトでは、ユーザーを「拡張」する新しいエンティティ (ExternalUser) を作成する必要があります。従来のユーザー レコードを作成し、それを新しいテーブルと 1 対 1 の関係でリンクすることによって、新しいエンティティを実装することにしました。新しい ExternalUser を作成するように求められると、UserRepository はレガシ コードを呼び出してレコードの User 部分を作成し、リポジトリは最初に EF Code ExternalUserContext を使用して ExternalUsers テーブルにレコードを作成します。もちろん、2 回目の呼び出しが何らかの理由で失敗した場合は、従来のユーザーの作成を元に戻したいと考えています。これは物事が失敗しているところです。SQL Server 2005 と EF Code 4.3.1 を使用しています。関連するコードは次のとおりです。

using (_context = new ExternalUserContext(Utils.ConnectionString))
{
     ObjectContext ob = ((IObjectContextAdapter) _context).ObjectContext;
     ob.Connection.Open();
     DbTransaction tran = ob.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
     _legacyUser = new blUser();
     long id = _legacyUser.Add(//Params go here);
     if (id > 0)
     {
         toCreate.UserID = id;
         _context.ExternalUsers.Add(toCreate);
         tran.Rollback(); //Just for testing
         throw new FieldAccessException("testing"); //just for testing
         _context.SaveChanges();
         tran.Commit();
      }else
      {
          throw new ArgumentException("Could not create legacy user");
      }
 }

トランザクションを明示的に管理しようとする前に、TransactionScope (ExternalUserContext をインスタンス化する前または後に開始) を使用してみましたが、まったく役に立ちませんでした。引用されたコードはエラーをスローしますが、ユーザー レコードはデータベースに残ります。VB コードは、実際のレコード作成を行う別の .dll を呼び出しています。両方の dll は、既定の設定で作成を TransactionScope にラップします。

私のコードが、データベース トランザクションを実行する dll を呼び出している dll を呼び出しているという事実は、ここで役割を果たしていますか? どんな助けでも大歓迎です。

4

1 に答える 1

0

申し訳ありませんが、これはコードの断片化の悪いケースによるものでした。挿入を行う低レベルの dll 用に私が持っているソース コードは、私のプロジェクトの参照を生成するために使用されるものではありません。相違点の中には、transactionscope が RequiresNew として定義されているという事実があります。誰かの時間を無駄にして申し訳ありません.....これは、バージョン管理の悪さが日々の作業をいかに無駄にするかの例としてまだ使用できます!!

于 2012-08-10T11:48:17.567 に答える