1

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

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

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

context.SaveChanges();

OtherComments 更改已成功保存回数据库,但 EmployeeSmokes 属性更改没有。EmployeeSmokes 属性是布尔值吗?和其他可为空的布尔字段也有同样的问题。

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

我也尝试过按照这个线程使用 ApplyCurrentValues 方法,但不幸的是它没有帮助。

任何想法为什么会发生这种情况?

4

2 回答 2

0

发表评论几分钟后,我找到了解决问题的方法,如果您仍然需要它,这也可能对您有所帮助。

我正在使用自我跟踪实体,我必须在生成的模板中添加一些代码。在UpdateOriginalValues(ObjectContext context, IObjectWithChangeTracker entity)方法中,我添加了以下片段:

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。我希望这会有用!

于 2011-07-04T08:06:34.840 回答
0

数据库中employeeSurvey.EmployeeSmokes 的值是多少?如果为真,EF 将注意到没有变化并在生成的更新 SQL 中忽略它,因为没有变化(您可以在 SQL Profiler 中验证这一点)。

于 2010-09-03T18:53:35.247 回答