对可空的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方法,但不幸的是它没有帮助。
为什么会发生这种情况?
答案 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。我希望这会有用!