1

次のコードがあります。

model = new Option();
model.val1 = newVal1;
model.val2 = newVal2;
model.val3 = newVal3;

//this saves new record just fine
if (recordCount < 1)
{
    context.Options.AddObject(model);
    context.SaveChanges();
}
else
{
    var tempID = from s in context.Options where (s.val1 == newVal1 && s.val2 == newVal2) select s.ID;
    var resultsID = tempID.First();
    model = context.Options.Single(m => m.ID == resultsID);
    if (TryUpdateModel(model, new[] { "val3" }))
    {
       //this isn't updating the record
       context.SaveChanges();
    }
}

データベースは新しいエントリを正常に追加しますが、更新していません。私は何が欠けていますか?ありがとう。

4

3 に答える 3

2

このコードを見て、まず新しいモデルを作成し、いくつかのプロパティを設定します。

model = new Option();  // <- A
model.val1 = newVal1;
model.val2 = newVal2;
model.val3 = newVal3;

次に、「else」パスを下っていると仮定して、次のようにします。

var tempID = from s in context.Options where (s.val1 == newVal1 && s.val2 == newVal2) select s.ID;
var resultsID = tempID.First();
model = context.Options.Single(m => m.ID == resultsID);  // <- B
if (TryUpdateModel(model, new[] { "val3" }))
{
   //this isn't updating the record
   context.SaveChanges();
}

context.Optionsこれは外に出て、一致する ID を持つエントリを見つけます。

これで、呼び出しmodelで作成したnew()(コメント「A」でマークした) が漂流し、別のものを取得しましたcontext.Options.Single()。これは、への呼び出しで取得したものです。コメント「B」でマークされています。作成したオブジェクトの内容ではなく、コンテキストの内容に基づいたプロパティがあります。その A オブジェクトはなくなりました。DB から新しいオブジェクト B を取得しました。

では、この取得したオブジェクトに対して TryUpdateModel を呼び出して、val3 が更新されたことを伝えていますが、値は変更されていませんよね? それはあなたが文脈から引き出したものです。

モデルオブジェクトはあなたが思っているものではないので、何も更新されません...あなたが更新したものはガベージコレクションされるのを待っています. 取得したものは、プロパティに対して取得した値がまだあるため、更新されていませんval3

ここであなたがやろうとしていることに従うと仮定すると、コンテキストに更新された値が表示されないのはそのためです。

val3取得したオブジェクトのプロパティの値を変更する場合は、model取得後に設定する必要があります。そうしないと上書きされます。

于 2012-10-09T19:15:15.867 に答える
0

グローバル コンテキストを使用している場合は、データベースへのソフト リンクではないため、コンテキスト自体を更新する必要があります。

 context.SaveChanges();
 DbContext context = new DbContext();
于 2012-10-09T18:19:20.067 に答える
0

かどうかを確認してくださいConfiguration.AutoDetectChangesEnabled = true

于 2012-10-09T18:25:01.753 に答える