(这是使用EntityFramework 4.2 CTP)
我还没有在网上找到任何对此的引用,虽然我可能在搜索时使用了错误的术语。还有一种非常可能的情况是,这是100%预期的行为,只是寻找确认而宁愿不挖掘tt模板(对此仍然是新的)。
假设我有一个名为Active的布尔字段的类,我有一行已将此值设置为true。我执行的代码将所述字段设置为True,而不管它的现有值。
这发生在完全相同的EDMX中,我所做的就是将代码生成模板从DbContext更改为EntityObject。
更新
好的,找到了我正在寻找的确认...认为这是一个骗局......下次我会做MOAR搜索!
Entity Framework: Cancel a property change if no change in value
更新2:
答案(或至少我找到的解决方案)按照要求转移到实际答案......
答案 0 :(得分:2)
根据要求,回答我自己的问题(对不起)......
问题:默认tt模板用“if(iskey)”包装setter中的“if(this!= value)”,因此只有primarykey字段才会收到此逻辑。
解决方案:这不是最优雅的事情,但我删除了这张支票......我们会看到它在实际使用中是如何实现的。我包含了整个tt模板,我的更改用** ...表示
更新确认并使用Entity-Framework 5 Beta 2中的相同方法解决
////////
//////// Write SimpleType Properties.
////////
private void WriteSimpleTypeProperty(EdmProperty simpleProperty, CodeGenerationTools code)
{
MetadataTools ef = new MetadataTools(this);
#>
/// <summary>
/// <#=SummaryComment(simpleProperty)#>
/// </summary><#=LongDescriptionCommentElement(simpleProperty, 1)#>
[EdmScalarPropertyAttribute(EntityKeyProperty= <#=code.CreateLiteral(ef.IsKey(simpleProperty))#>, IsNullable=<#=code.CreateLiteral(ef.IsNullable(simpleProperty))#>)]
[DataMemberAttribute()]
<#=code.SpaceAfter(NewModifier(simpleProperty))#><#=Accessibility.ForProperty(simpleProperty)#> <#=MultiSchemaEscape(simpleProperty.TypeUsage, code)#> <#=code.Escape(simpleProperty)#>
{
<#=code.SpaceAfter(Accessibility.ForGetter(simpleProperty))#>get
{
<#+ if (ef.ClrType(simpleProperty.TypeUsage) == typeof(byte[]))
{
#>
return StructuralObject.GetValidValue(<#=code.FieldName(simpleProperty)#>);
<#+
}
else
{
#>
return <#=code.FieldName(simpleProperty)#>;
<#+
}
#>
}
<#=code.SpaceAfter(Accessibility.ForSetter((simpleProperty)))#>set
{
<#+
**//if (ef.IsKey(simpleProperty))
**//{
if (ef.ClrType(simpleProperty.TypeUsage) == typeof(byte[]))
{
#>
if (!StructuralObject.BinaryEquals(<#=code.FieldName(simpleProperty)#>, value))
<#+
}
else
{
#>
if (<#=code.FieldName(simpleProperty)#> != value)
<#+
}
#>
{
<#+
PushIndent(CodeRegion.GetIndent(1));
**//}
#>
<#=ChangingMethodName(simpleProperty)#>(value);
ReportPropertyChanging("<#=simpleProperty.Name#>");
<#=code.FieldName(simpleProperty)#> = <#=CastToEnumType(simpleProperty.TypeUsage, code)#>StructuralObject.SetValidValue(<#=CastToUnderlyingType(simpleProperty.TypeUsage, code)#>value<#=OptionalNullableParameterForSetValidValue(simpleProperty, code)#>, "<#=simpleProperty.Name#>");
ReportPropertyChanged("<#=simpleProperty.Name#>");
<#=ChangedMethodName(simpleProperty)#>();
<#+
**//if (ef.IsKey(simpleProperty))
**//{
PopIndent();
#>
}
<#+
**//}
#>
}
}