使用实体框架切换唯一标识符

时间:2019-01-08 12:26:41

标签: c# entity-framework

我正在尝试在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块可以回滚所有内容。如果我在每次更改后不保存上下文,它将失败。我真的很想这样更清洁,但我不知道是否有办法。我在这里学习,请赐教。

1 个答案:

答案 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();
            }
        }