Обновление логических полей, допускающих значение NULL, в Entity Framework

Изменения свойств bool, допускающих значение NULL, не сохраняются обратно в базу данных в EF4, однако другие поля, допускающие значение NULL, обновляются без каких-либо проблем. Например, если я выполняю простой запрос, подобный следующему:

EmployeeSurvey employeeSurvey = context.EmployeeSurveys.SingleOrDefault(s => s.EmployeeSurveyID == 60);

employeeSurvey.EmployeeSmokes = true; 
employeeSurvey.OtherComments = "Test comment";

context.SaveChanges();

Изменения OtherComments успешно сохраняются обратно в базу данных, однако изменения свойства EmployeeSmokes не сохраняются. Свойство EmployeeSmokes является логическим? и другие логические поля, допускающие значение NULL, имеют ту же проблему.

Кроме того, проблема возникает только при изменении/обновлении существующих записей EmployeeSurvey — все свойства, включая EmployeeSmokes, успешно сохраняются при создании/вставке новых EmployeeSurvey.

Я также пытался использовать метод ApplyCurrentValues ​​в соответствии с этой веткой, но, к сожалению, это не помогло.

Есть идеи, почему это происходит?


person Steve    schedule 01.09.2010    source источник
comment
Ваш код правильный. Проблема в другом (не в вашем вопросе). Это работает для меня. Вам нужно отладить это больше. Попробуйте трассировку SQL.   -  person Craig Stuntz    schedule 01.09.2010
comment
У меня такая же проблема, как и у вас, но это для целых чисел, допускающих значение NULL. Из того, что мне удалось проверить, когда вы добавляете объект в базу данных, а для поля установлено значение null, после этого вы не сможете обновить его с помощью EF... Итак, я предположим, это какой-то баг. Я продолжу поиск и напишу ответ, если что-то найду.   -  person Ivan Nikolov    schedule 04.07.2011


Ответы (2)


Каково значение employeeSurvey.EmployeeSmokes в базе данных? Если это правда, EF заметит, что изменений нет, и пропустит их из сгенерированного обновления SQL, поскольку изменений нет (это можно проверить в SQL Profiler).

person user439241    schedule 03.09.2010

Через несколько минут после публикации комментария я нашел решение своей проблемы, которое может помочь и вам, если вам это все еще нужно.

Я использую объекты самоотслеживания, и мне пришлось добавить некоторый код в сгенерированный шаблон. В методе UpdateOriginalValues(контекст ObjectContext, объект IObjectWithChangeTracker) я добавил следующий фрагмент:

foreach(EdmProperty property in entityType.Properties)
    {
        object value;
        if(property.TypeUsage.EdmType is PrimitiveType && entity.ChangeTracker.OriginalValues.TryGetValue(property.Name, out value))
        {
            //START OF EDIT
            if (value == null && property.Nullable)
            {
                var currentValues = entry.CurrentValues;
                int ordinal = currentValues.GetOrdinal(property.Name);
                var temp = currentValues[ordinal];
                currentValues.SetDBNull(ordinal);
                entry.ApplyOriginalValues(entity);
                currentValues.SetValue(ordinal, temp);
            }
            //END OF EDIT
            originalValueRecord.SetValue(property, value);
        }
        else if(property.TypeUsage.EdmType is ComplexType)
        {
            OriginalValueRecord complexOriginalValues = originalValueRecord.GetOriginalValueRecord(property.Name);
            UpdateOriginalValues((ComplexType)property.TypeUsage.EdmType, entity.GetType().FullName, property.Name, entity.ChangeTracker.OriginalValues, complexOriginalValues);
        }
    }

Исходный источник: ЗДЕСЬ. Я надеюсь, что это будет полезно!

person Ivan Nikolov    schedule 04.07.2011