2013-02-13 7 views
6
var paymentAttempt = _auctionContext.PaymentAttempts.Where(o => o.Id == paymentAttemptId).SingleOrDefault(); 
if (paymentAttempt != null) 
{ 
    paymentAttempt.PaymentAttemptStatusId = (int)PaymentAttemptStatus.Defunct; 
    paymentAttempt.PaymentAttemptStatus = _auctionContext.PaymentAttemptStatuses.Where(pas => pas.Id == paymentAttempt.PaymentAttemptStatusId).First(); 

    var relevantWinningBidsTotalPrices = _auctionContext.GetWinningBidsTotalPricesForPaymentAttempt(paymentAttemptId).ToArray(); 

    foreach (var winningBid in relevantWinningBidsTotalPrices) 
    { 
     winningBid.Locked = false; 
     _auctionContext.UpdateObject(winningBid); 
    } 
    _auctionContext.SaveChanges(); 
} 

を更新していないが期待しかしpaymentAttemptでないようwinningBidが更新されると呼ばれます。どうしてこれなの?それは本当にイライラしています。どちらもエラーはありません。私は、EFがオブジェクトなどを追跡していないなどの問題があった場合にエラーが発生すると予想しますが、そのようなエラーは発生していません。エンティティフレームワークのSaveChanges()</p> <pre><code>_auctionContext.SaveChanges(); </code></pre><p>後のデータベースに上記のコードで

+0

使用すると、あなたを取得するためにアタッチ変更されたエンティティをコンテキストに保存します。文脈は、あなたが何を話しているのか分かりませんでした。 – Tabish

答えて

10

paymentAttemptオブジェクトをコンテキストに渡して、オブジェクトを更新する必要があることを知らせる必要があるからです。例えば

_auctionContextDbContextのインスタンスであると仮定すると:

// any changes related to the paymentAttempt object 

_auctionContext.Entry(paymentAttempt).State = EntityState.Modified; 

foreach (var winningBid in relevantWinningBidsTotalPrices) 
{ 
    winningBid.Locked = false; 
    _auctionContext.UpdateObject(winningBid); 
} 

_auctionContext.SaveChanges(); 

別のオプションは、Attach方法である:

_auctionContext.Attach(paymentAttempt); 
_auctionContext.ObjectStateManager.ChangeObjectState(paymentAttempt, System.Data.EntityState.Modified); 
+0

私はEntryメソッドを持っていません。 –

+0

どのエンティティフレームワークのバージョンを使用していますか? – Jorge

+0

4. EFの上でWCFデータサービスを使用しています。 –

1

私はこの質問ではなく、別の問題のために落ちました。私は、変更されていないオブジェクトに対してSaveChanges()を呼び出すと、EFは何も更新しないことを発見しました。これは理にかなっていますが、フィールドが変更されたかどうかに関係なく、SaveChanges()が実行されたことを他のユーザーに見せるように、DBを更新する必要がありました。任意のフィールドを変更せずに更新を強制するには:あなたが追加Entry試していない場合は

Dim entry As DbEntityEntry = entities.Entry(myentity) 
    entry.State = Entity.EntityState.Modified 
2

は:

using System.Data.Entity.Infrastructure; 

using System.Data.Entity; 

を、あなたは、単に使用することができます:

_auctionContext.Entry(paymentAttempt).State = EntityState.Modified; 
_auctionContext.SaveChanges(); 
関連する問題