Переключение уникальных идентификаторов с помощью entityframework - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь переключить уникальные идентификаторы между двумя объектами. Мое текущее решение работает, но далеко не красиво. Сначала я установил одно имя пользователя на «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 голосов
/ 08 января 2019

Мне бы очень хотелось, чтобы это было чище

Используйте транзакцию, если при возникновении ошибки она не будет отправлена ​​в базу данных, поэтому откат не требуется.

Примерно так:

        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();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...