私は次のことを実施するための最良の方法や練習であると思いまして:EF取引C#のMySQLのコネクタ
私は次のように定義があるEditUserと呼ばれる方法があります:あなたは気づくことのよう
public void EditUser(user user, Roles role)
{
using (TestEntities entities = new TestEntities())
{
entities.Connection.Open();
using (DbTransaction trans = entities.Connection.BeginTransaction())
{
try
{
var tmpUser = entities.users.Where(fields => fields.UserId == user.UserId).FirstOrDefault();
RoleManagement rm = new RoleManagement();
string oldRole = tmpUser.roles.FirstOrDefault().Name;
string newRole = rm.GetRoleName(role);
if (oldRole == newRole)
{
entities.users.ApplyCurrentValues(user);
}
else
{
rm.UnbindRoles(tmpUser.UserId, entities.Connection);
this.DeleteUser(tmpUser.UserId, entities.Connection);
this.Register(user, role, entities.Connection);
}
entities.SaveChanges();
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
}
}
}
を私は、UnbindRoles、DeleteUser、RegisterUserといういくつかのメソッドを呼び出しています。何かが失敗した場合は、ロールバックする必要があるため、すべて同じトランザクション(EditUserが実行している同じトランザクション)で実行する必要があります。
私の問題は主にここにあります... RegisterUserメソッドは、ユーザーを追加して新しいユーザーに役割を割り当てるため、新しいトランザクションも開始します。
誰もがこれを実装する最良の方法を記述できますか?私はのTransactionScopeブロックを使用してみましたが、私は私ので、ミディアム・トラストの下のTransactionScopeを使用した場合のMySQL .NETコネクタプロバイダがバグを持っていることを確認ミディアム・トラスト環境
EDIT
でこのアプリケーションを実行していますので、それが失敗しましたMS SQL Serverデータベースを使用して同じシナリオをテストしましたが、問題なく動作します。
に対処することができます!スロー・エックス; !!! スタックタクシーを本当に失いたくない場合は、投げてください。 – BennyM
そのスローは呼び出し元によってキャッチされ、再度スローされます。これにより、Application_ErrorイベントのGlobal.asaxがエラーの汎用処理を行います – Ryan
スローの違いを知っていることを確認します。 exを投げる; – BennyM