11
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();
}

上記のコードの

_auctionContext.SaveChanges();

が呼び出さwinningBidれ、期待どおりに更新されますが、paymentAttemptそうではありません。どうしてこれなの?本当にイライラします。エラーもありません。EFがオブジェクトを追跡していないなどの問題が発生した場合、エラーが発生することが予想されますが、そのようなエラーは発生していません。

4

4 に答える 4

21

paymentAttemptこれは、更新が必要なオブジェクトであることを知らせるために、オブジェクトをコンテキストに渡す必要があるためです。

たとえば、次_auctionContextのインスタンスであると仮定しますDbContext

// 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);
于 2013-02-13T16:20:23.473 に答える
1

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

    Dim entry As DbEntityEntry = entities.Entry(myentity)
    entry.State = Entity.EntityState.Modified
于 2015-01-16T13:59:03.587 に答える