2

(Dies ist mit EntityFramework 4.2 CTP)Unterschiedliche Setter Verhalten zwischen DbContext und Object

ich keine Verweise auf diese im Web noch nicht gefunden haben, obwohl es wahrscheinlich ist, ich die falsche Terminologie bin mit während der Suche. Es gibt auch ein sehr wahrscheinliches Szenario, in dem dies zu 100% erwartetes Verhalten ist, das nur nach Bestätigung sucht und sich lieber nicht durch die tt-Vorlage bohrt (noch neu dazu).

Angenommen, ich habe eine Klasse mit einem booleschen Feld namens Active und ich habe eine Zeile, die diesen Wert bereits auf true gesetzt hat. Ich habe Code, der ausführt, um das Feld auf True zu setzen, unabhängig von seinem vorhandenen Wert.

  • Wenn ich DbContext verwenden, um den Wert auf True zu aktualisieren, wird kein Update durchgeführt.
  • Wenn ich ObjectContext verwenden, um den Wert zu aktualisieren, wird ein Update unabhängig von dem vorhandenen Wert vorgenommen.
  • Dies geschieht in der gleichen EDMX, alles, was ich getan habe, war die Code-Generierungsvorlage von DbContext zu EntityObject ändern.

    Update:

    Ok, fand die Bestätigung die ich suchte ... betrachten diese eine Betrogene ... ich das nächste Mal werde tun MOAR GESUCHT!

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

    Update 2:

    Antwort (oder zumindest die Lösung, die ich gefunden) auf tatsächliche Antwort bewegt wie gewünscht ...

    +0

    Bitte verwenden setzen Sie Ihre Lösung als eine Antwort. –

    +0

    Sobald meine 8-stündige "Selbst-Antwort" Wartezeit abgelaufen ist, poste ich sie bei Bedarf. – Paul

    Antwort

    2

    Wie gewünscht, die Antwort auf meine eigene Frage (tut mir leid) ...

    Problem: die Standard-tt-Vorlage Wraps das "if (this! = value)" im Setter mit "if (iskey), so dass nur Primärschlüsselfelder diese Logik erhalten.

    Lösung: es ist nicht die anmutigste Sache, aber ich entfernte diesen Check ... wir werden sehen, wie es im realen Gebrauch herausschwenkt. Ich umfasste die gesamte tt Vorlage, meine Änderungen durch ** ...

    Update: bestätigt und umgingen gleiche Methode in 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(); 
    #> 
         } 
    <#+ 
         **//} 
    #> 
        } 
    }