2010-09-01 8 views
0

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

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

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

context.SaveChanges(); 

В OtherComments изменения успешно сохранены обратно в БД однако изменения свойств EmployeeSmokes не являются. Свойством EmployeeSmokes является bool? и другие нулевые логические поля имеют одинаковую проблему.

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

Я также пробовал использовать метод ApplyCurrentValues ​​в соответствии с this thread, но, к сожалению, он не помог.

Любые идеи, почему это происходит?

+0

Ваш код верный. Проблема в другом месте (не в вашем вопросе). Это работает для меня. Вам нужно отладить это больше. Попробуйте выполнить трассировку SQL. –

+0

У меня такая же проблема, как и у вас, но для нулевых целых чисел. Из того, что мне удалось проверить, когда вы добавляете объект в базу данных, а поле имеет значение ** null **, после этого вы не сможете обновить его с помощью EF ... Поэтому я полагаю, что это какая-то ошибка. Я продолжу поиск, и я отправлю ответ, если найду что-нибудь. –

ответ

0

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

0

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

Я использую самообучающиеся объекты, и мне пришлось добавить код в сгенерированный шаблон. В 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); 
     } 
    } 

оригинальный источник HERE. Надеюсь, это будет полезно!

Смежные вопросы