我想知道什么是执行下面的最好办法或做法: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