2010-09-01 58 views
0

对可空布尔属性的更改不会保存回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方法根据this thread,但不幸的是它没有帮助。

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

+0

您的代码是正确的。问题在别处(不在你的问题中)。这对我有用。您需要更多地进行调试。尝试SQL跟踪。 – 2010-09-01 12:43:14

+0

我遇到了像你一样的问题,但它是可空的整数。从我设法测试的时候,当你在数据库中添加实体并且该字段被设置为** null **时,在那之后你将不能使用EF来更新它...所以我想这是某种错误。我会继续搜索,如果我找到答案,我会发布一个答案。 – 2011-07-04 07:43:22

回答

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