Платформа сущностей обновляет связанные сущности без конфликта параллелизма - PullRequest
0 голосов
/ 09 мая 2018

У меня есть две связанные сущности: User и UserProfile. Пользователь может иметь много профилей (настроек). Я хочу иметь возможность обновлять их вместе, но в настоящее время я получаю ошибку параллелизма, когда я делаю это:

Оператор хранения, вставки или удаления затронул неожиданное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов. См. http://go.microsoft.com/fwlink/?LinkId=472540 для получения информации о понимании и обработке исключений оптимистичного параллелизма.

Это мой код для обновления:

public void UpdateUser(UserList user, int timeoutMins)
{
    using (var ctx = GetCodingContext())
    {
        try
        {
            ctx.Entry(user).State = System.Data.Entity.EntityState.Modified;
            CR_USER_PROFILE timeoutProfile = GetTimeoutUserProfile(user.UserGUID);
            if (timeoutProfile != null && !timeoutProfile.PROFILE_VALUE.Equals(timeoutMins.ToString()))
            {
                timeoutProfile.PROFILE_VALUE = timeoutMins.ToString();
                UpdateUserProfile(timeoutProfile,ctx);
            }
            else if(timeoutProfile == null && timeoutMins > 0)
            {
                var timeoutKey = FFCEnumerations.Profiles.Keys.Timeout.GetStringValue();
                AddUserProfile(user, timeoutKey, timeoutMins.ToString(), ctx);
            }
            ctx.SaveChanges();
        }
        catch (Exception ex)
        {
            throw new Exception("Error occurred updating user " + ex);
        }
    }
}

public void UpdateUserProfile(CR_USER_PROFILE profile, CodingContext ctx)
{
    try
    {
        ctx.Entry(profile).State = System.Data.Entity.EntityState.Modified;
    }
    catch (Exception)
    {
        throw new Exception("Error occurred updating User Profile");
    }
}

public CR_USER_PROFILE GetTimeoutUserProfile(Guid userGuid)
{
    using (var ctx = GetCodingContext())
    {
        var timeoutKey = FFCEnumerations.Profiles.Keys.Timeout.GetStringValue();
        var profileList = ctx.CR_USER_PROFILE.Where(p => p.UserGUID == userGuid && p.PROFILE_TYPE_CD == timeoutKey);
        return profileList.SingleOrDefault();
    }
}

Хорошо работает, когда я добавляю обе сущности, но не при обновлении. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Я выяснил, что я использовал другой контекст для получения профиля, который я хотел обновить. Это вызывало конфликт параллелизма, потому что EF думал, что эта сущность изменяется где-то еще (другой контекст). Итак, я создал перегрузку для этого метода, чтобы я мог передать контекст в качестве аргумента и извлечь объект с тем же контекстом, с которым я собирался обновить его.

public CR_USER_PROFILE GetTimeoutUserProfile(Guid userGuid, CodingContext ctx)
{
    var timeoutKey = FFCEnumerations.Profiles.Keys.Timeout.GetStringValue();
    var profileList = ctx.CR_USER_PROFILE.Where(p => p.UserGUID == userGuid && p.PROFILE_TYPE_CD == timeoutKey);
    return profileList.SingleOrDefault();
}
0 голосов
/ 09 мая 2018
...