1

null 許容の bool プロパティへの変更は EF4 のデータベースに保存されませんが、null 許容の他のフィールドは問題なく更新されます。たとえば、次のような単純なクエリを実行するとします。

EmployeeSurvey employeeSurvey = context.EmployeeSurveys.SingleOrDefault(s => s.EmployeeSurveyID == 60);

employeeSurvey.EmployeeSmokes = true; 
employeeSurvey.OtherComments = "Test comment";

context.SaveChanges();

OtherComments の変更は正常にデータベースに保存されますが、EmployeeSmokes プロパティの変更は保存されません。EmployeeSmokes プロパティはブール値ですか? および他の null 許容ブール値フィールドにも同じ問題があります。

さらに、既存の EmployeeSurvey レコードを変更/更新する場合にのみ問題が発生します。新しい EmployeeSurvey を作成/挿入すると、EmployeeSmokes を含むすべてのプロパティが正常に保存されます。

このスレッドに従って ApplyCurrentValues メソッドも使用してみましたが、残念ながら役に立ちませんでした。

なぜこれが起こっているのですか?

4

2 に答える 2

0

データベース内の employeeSurvey.EmployeeSmokes の値は? true の場合、EF は変更がないことを認識し、変更がないため、生成された更新 SQL からそれを省略します (これは SQL プロファイラーで確認できます)。

于 2010-09-03T18:53:35.247 に答える
0

コメントを投稿してから数分後、問題の解決策を見つけました。これがまだ必要な場合は、それも役立つかもしれません。

セルフ トラッキング エンティティを使用しており、生成されたテンプレートにコードを追加する必要がありました。UpdateOriginalValues(ObjectContext context, IObjectWithChangeTracker entity)メソッドで、次のフラグメントを追加しました。

foreach(EdmProperty property in entityType.Properties)
    {
        object value;
        if(property.TypeUsage.EdmType is PrimitiveType && entity.ChangeTracker.OriginalValues.TryGetValue(property.Name, out value))
        {
            //START OF EDIT
            if (value == null && property.Nullable)
            {
                var currentValues = entry.CurrentValues;
                int ordinal = currentValues.GetOrdinal(property.Name);
                var temp = currentValues[ordinal];
                currentValues.SetDBNull(ordinal);
                entry.ApplyOriginalValues(entity);
                currentValues.SetValue(ordinal, temp);
            }
            //END OF EDIT
            originalValueRecord.SetValue(property, value);
        }
        else if(property.TypeUsage.EdmType is ComplexType)
        {
            OriginalValueRecord complexOriginalValues = originalValueRecord.GetOriginalValueRecord(property.Name);
            UpdateOriginalValues((ComplexType)property.TypeUsage.EdmType, entity.GetType().FullName, property.Name, entity.ChangeTracker.OriginalValues, complexOriginalValues);
        }
    }

元のソースはHEREです。これが役立つことを願っています!

于 2011-07-04T08:06:34.840 に答える