特定のビジネス ロジックを実装し、データベースへの「レガシー ユーザー」レコードの追加を処理する、ユーザー テーブルとコード ベース (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 を呼び出しているという事実は、ここで役割を果たしていますか? どんな助けでも大歓迎です。