DbContext和ObjectContext之间的不同setter行为

时间:2012-03-26 16:34:30

标签: c# entity-framework entity-framework-4 dbcontext objectcontext

(这是使用EntityFramework 4.2 CTP)

我还没有在网上找到任何对此的引用,虽然我可能在搜索时使用了错误的术语。还有一种非常可能的情况是,这是100%预期的行为,只是寻找确认而宁愿不挖掘tt模板(对此仍然是新的)。

假设我有一个名为Active的布尔字段的类,我有一行已将此值设置为true。我执行的代码将所述字段设置为True,而不管它的现有值。

  • 如果我使用DbContext将值更新为True,则不进行更新。
  • 如果我使用ObjectContext更新值,则进行更新 无论现有价值如何。

这发生在完全相同的EDMX中,我所做的就是将代码生成模板从DbContext更改为EntityObject。

更新

好的,找到了我正在寻找的确认...认为这是一个骗局......下次我会做MOAR搜索!

Entity Framework: Cancel a property change if no change in value

更新2:

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

1 个答案:

答案 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();
#>
        }
<#+
        **//}
#>
    }
}