我想知道什麼是執行下面的最好辦法或做法: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塊,但因爲我在運行中等信任環境
編輯
這個應用程序確認MySQL的.NET連接器供應商,因爲我在中等信任使用的TransactionScope時有一個bug失敗剛剛使用MS SQL Server數據庫測試過相同的場景,並且其工作沒有任何問題
另一個話題: 糟糕!前投! 除非你真的想失去你的堆棧,否則你應該拋出。 – BennyM
拋出被調用者捕獲並再次拋出,以便Application_Error事件中的Global.asax將執行錯誤的通用處理 – Ryan
只要確保知道throw之間的區別;並扔掉ex; – BennyM