2017-01-27 2 views
1

にコミットしない方法(ボタンのクリックでトリガー)DbContext.SaveChanges()これは、ASP.NET MVCコントローラのアクションの一部である私のコードであり、SQL Serverデータベース

using(var context = new EDIDEVEntities()) 
{ 
    var result = from b in context.DOWNLOAD_ORDER_HEADER.Where(b => csgList.Contains(b.PRO_NUM_ALPHA)) select b; 

    foreach (var item in result) 
    { 
     item.STATUS = "Assigned"; 
    } 

    context.SaveChanges(); 
} 

それはスローされません。エラーはありますが、データベース内のレコードは更新されません。

私はこのラインを使用してみました:foreachループの前

context.Entry(result).State = EntityState.Modified; 

を、それはエンティティタイプDbQuery`1は、現在のモデルの一部ではない

を言うエラーがスローされますコンテキスト

私はコードの実際の行のようなものでなければならないことを理解する:

DOWNLOAD_ORDER_HEADER doh; 
context.Entry(doh).State = EntityState.Modified; 

しかし、DOWNLOAD_ORDER_HEADERテーブルの1つのフィールドは、LINQクエリで返された行のみを更新する必要があります。これどうやってするの?

+0

'context.Entry(Item).State = EntityState.Modified; 'ループ内 –

+0

同じコンテキストで更新が実行されるため、エンティティの状態を手動で変更しなくても正常に動作するはずです。あなたは 'result'で期待される出力を得ていますか? – Developer

+0

foreach行の前/にブレークポイントを追加して、 'result'が空でないことを確認することができます。さもなければ、私は変更がどのように保存されないかはわかりません。 –

答えて

1

実際にアイテムを変更している場合は、context.Entry(item).Stateを変更する必要はありません.startUSが既に「割り当て済み」に等しい場合、Entity Frameworkは次のように更新を行いません。変更はありません。テストのために

、これはあなたがループの検索結果の各項目の状態を設定する必要があり、エンティティの状態を正確に変化です:

var result = from b in context.DOWNLOAD_ORDER_HEADER.Where(b => csgList.Contains(b.PRO_NUM_ALPHA)) select b; 
foreach (var item in result) 
{ 
    item.STATUS = "Assigned"; 
    context.Entry(item).State = EntityState.Modified; 
} 

Entity Frameworkのは、自動的に各の状態を設定されていないのはなぜDOWNLOAD_ORDER_HEADER変更されたEntityは、item.STATUSが「Assigned」以外のものであれば、context.SaveChanges(); forループがデータベースを更新する必要があります。

一方、forループの各項目に対して手動でcontext.Entry(item).State = EntityState.Modified;を実行すると、データベースが更新されていることを証明するかどうかが証明されます。

このコードはtry catchブロックにラップされていますが、実際には例外がスローされ、処理されている可能性がありますか?

+0

私はそれを試しましたが、context.SaveChanges()は3の値を返します(これはデータベースで更新されるはずの行の数に一致しますが、データベースにクエリを実行するとその変更は存在しません)。 – doodles

+0

おそらく、 –

+0

@doodlesデータベースクエリに何か問題がある可能性があります –

-1

下記のコードを試してみてください。

コンテキスト "あなたのデータベーステーブル" .AddObject(結果); context.SaveChanges();

+0

彼のオブジェクトはすでに**コンテキストの一部です。彼はただ更新しています**絶対必要はありません* * '.AddObject'を使用する - これとは逆に、これは**エラーになります**(そのオブジェクト**はすでに**コンテキストの一部です!) –

+0

この回答を削除してください。正しくありません。オブジェクトすでにコンテキストの一部である場合、コンテキストクエリは、各エンティティが反復処理を行うためのものです –

関連する問題