我正在尝试在2个实体之间切换唯一标识符。我当前的解决方案可行,但还远远不够。首先,我将一个用户名设置为“ temp”,因此用户名之间没有重叠。之后,我切换它们。
public void SwitchUsernames(Guid personIdOld, Guid personIdNew)
{
// Get accounts
var personOld = GetAccount(personIdOld);
var personNew = GetAccount(personIdNew);
// switch usernames
string usernamePersonOld = personOld.username;
string usernamePersonNew = personNew.username;
try
{
personOld.SetUsername("Temp");
Context.SaveChanges();
}
catch (Exception) { throw; }
try
{
personNew.SetUsername(usernamePersonOld);
Context.SaveChanges();
}
catch (Exception)
{
personOld.SetUsername(usernamePersonOld);
Context.SaveChanges();
throw;
}
try
{
personOld.SetUsername(usernamePersonNew);
Context.SaveChanges();
}
catch (Exception)
{
personOld.SetUsername(usernamePersonOld);
Context.SaveChanges();
personNew.DomainAccounts.SetUsername(usernamePersonNew);
Context.SaveChanges();
throw;
}
}
在出现故障时,trycatch块可以回滚所有内容。如果我在每次更改后不保存上下文,它将失败。我真的很想这样更清洁,但我不知道是否有办法。我在这里学习,请赐教。
答案 0 :(得分:1)
我真的很想要这个清洁工
使用事务,当发生错误时,它将不会推送到数据库,因此不需要回滚。
类似这样的东西:
public void SwitchUsernames(Guid personIdOld, Guid personIdNew)
{
// Get accounts
var personOld = Accounts.Find(personIdOld);
var personNew = Accounts.Find(personIdNew);
// switch usernames
string usernamePersonOld = personOld.UserName;
string usernamePersonNew = personNew.UserName;
using (var tran = _context.Database.BeginTransaction())
{
var temp = "TempName" + Guid.NewGuid().ToString();
personOld.UserName = temp;
_context.SaveChanges();
personNew.UserName = usernamePersonOld;
_context.SaveChanges();
personOld.UserName = usernamePersonNew;
_context.SaveChanges();
tran.Commit();
}
}