Обновление обнуляемых логических полей в Entity Framework - PullRequest
0 голосов
/ 01 сентября 2010

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

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 ​​какпо этой теме но, к сожалению, это не помогло.

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

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

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

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

0 голосов
/ 03 сентября 2010

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

...