C# DbContext和ObjectContext之间的不同setter行为
(这是使用EntityFramework 4.2 CTP) 我还没有在网上找到任何与此相关的参考资料,尽管我在搜索时可能使用了错误的术语。还有一种很有可能的情况是,这是100%的预期行为,只是寻找确认,而不是挖掘tt模板(这仍然是新的) 假设我有一个名为Active的布尔字段类,并且有一行已经将该值设置为true。我有一个代码,可以执行该代码将所述字段设置为True,而不管它的现有值如何C# DbContext和ObjectContext之间的不同setter行为,c#,entity-framework,entity-framework-4,dbcontext,objectcontext,C#,Entity Framework,Entity Framework 4,Dbcontext,Objectcontext,(这是使用EntityFramework 4.2 CTP) 我还没有在网上找到任何与此相关的参考资料,尽管我在搜索时可能使用了错误的术语。还有一种很有可能的情况是,这是100%的预期行为,只是寻找确认,而不是挖掘tt模板(这仍然是新的) 假设我有一个名为Active的布尔字段类,并且有一行已经将该值设置为true。我有一个代码,可以执行该代码将所述字段设置为True,而不管它的现有值如何 如果使用DbContext将值更新为True,则不会进行更新 如果使用ObjectContext更新值,则
- 如果使用DbContext将值更新为True,则不会进行更新
- 如果使用ObjectContext更新值,则会进行更新 不考虑现有值
答案(或至少是我找到的解决方案)按要求转移到实际答案…按要求,我自己问题的答案(对不起) 问题:默认tt模板将setter中的“if(this!=value)”包装为“if(iskey)”,因此只有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();
#>
}
<#+
**//}
#>
}
}
////////
////////编写SimpleType属性。
////////
私有void WriteSimpleTypeProperty(EdmProperty simpleProperty,CodeGenerationTools代码)
{
MetadataTools ef=新的MetadataTools(此);
#>
///
///
///
[EdmScalarPropertyAttribute(EntityKeyProperty=,IsNullable=)]
[DataMemberAttribute()]
{
得到
{
返回StructuralObject.GetValidValue();
返回;
}
设置
{
如果(!StructuralObject.BinaryEquals(,value))
如果(!=值)
{
(价值);
报告财产变更(“”);
=StructuralObject.SetValidValue(值“”);
报告财产变更(“”);
();
}
}
}
请将您的解决方案作为答案。一旦我8小时的“自我回答”等待结束,如果需要,我会发布它。