更新实体框架中的可空布尔字段

时间:2010-09-01 09:49:34

标签: entity-framework nullable boolean updates

对可空的bool属性的更改不会保存回EF4中的数据库,但是其他可以为空的字段正在更新而没有任何问题。例如,如果我执行类似于以下的简单查询:

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

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

context.SaveChanges();

OtherComments更改已成功保存回db,但EmployeeSmokes属性更改未成功。 EmployeeSmokes属性是bool?和其他可以为空的布尔字段有相同的问题。

此外,仅在更改/更新现有EmployeeSurvery记录时才会出现此问题 - 在创建/插入新的EmployeeSurveys时,所有属性(包括EmployeeSmokes)都已成功保存。

我也尝试按照this thread使用ApplyCurrentValues方法,但不幸的是它没有帮助。

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:0)

数据库中employeeSurvey.EmployeeSmokes的价值是多少?如果确实如此,EF会注意到没有更改,并且在生成的Update SQL中省略了它,因为没有更改(您可以在SQL事件探查器中对此进行验证)。

答案 1 :(得分:0)

发表评论几分钟后,我找到了解决问题的方法,如果您仍然需要,也可以帮到您。

我正在使用自我跟踪实体,我不得不在生成的模板中添加一些代码。在 UpdateOriginalValues(ObjectContext context,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。我希望这会有用!