C# DbContext和ObjectContext之间的不同setter行为

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更新值,则

(这是使用EntityFramework 4.2 CTP)

我还没有在网上找到任何与此相关的参考资料,尽管我在搜索时可能使用了错误的术语。还有一种很有可能的情况是,这是100%的预期行为,只是寻找确认,而不是挖掘tt模板(这仍然是新的)

假设我有一个名为Active的布尔字段类,并且有一行已经将该值设置为true。我有一个代码,可以执行该代码将所述字段设置为True,而不管它的现有值如何

  • 如果使用DbContext将值更新为True,则不会进行更新
  • 如果使用ObjectContext更新值,则会进行更新 不考虑现有值
这发生在完全相同的EDMX中,我所做的只是将代码生成模板从DbContext更改为EntityObject

更新:

<找到我正在寻找的确认……这是一个骗局…下次我会进行搜查!p>

更新2:


答案(或至少是我找到的解决方案)按要求转移到实际答案…

按要求,我自己问题的答案(对不起)

问题:默认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小时的“自我回答”等待结束,如果需要,我会发布它。