Различное поведение сеттера между DbContext и ObjectContext - PullRequest
2 голосов
/ 26 марта 2012

(используется EntityFramework 4.2 CTP)

Я еще не нашел ссылок на это в Интернете, хотя, вероятно, я использую неправильную терминологию при поиске. Существует также очень вероятный сценарий, в котором это 100% ожидаемое поведение, просто ищет подтверждения и не будет копаться в шаблоне tt (все еще новичок в этом).

Предполагается, что у меня есть класс с логическим полем с именем Active, и у меня есть одна строка, в которой уже установлено значение true. У меня есть код, который выполняется, чтобы установить указанное поле в True независимо от его существующего значения.

  • Если я использую DbContext для обновления значения до True, обновление не производится.
  • Если я использую ObjectContext для обновления значения, выполняется обновление независимо от существующего значения.

Это происходит в том же EDMX, все, что я сделал, это изменил шаблон генерации кода с DbContext на EntityObject.

Обновление:

Хорошо, нашел подтверждение, которое я искал ... посчитайте это обманом ... в следующий раз я сделаю ПОИСК МОРА!

Entity Framework: отменить изменение свойства, если не изменилось значение

Обновление 2:

Ответ (или, по крайней мере, найденное мной решение) перешел к фактическому ответу в соответствии с запросом ...

1 Ответ

2 голосов
/ 27 марта 2012

По запросу ответ на мой собственный вопрос (извините) ...

Проблема: шаблон tt по умолчанию оборачивает "if (this! = Value)" в установщикес "if (iskey), поэтому только поля primarykey получают эту логику.

Решение: это не самая изящная вещь, но я убрал эту проверку ... посмотрим, как онав реальном использовании. Я включил весь шаблон tt, мои изменения обозначены ** ...

Обновление: подтверждено и обошлось с использованием того же метода в Entity-Framework 5 Beta2

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