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 回答
4

如果您没有Entry尝试添加:

using System.Data.Entity.Infrastructure;

using System.Data.Entity;

那么你可以简单地使用:

_auctionContext.Entry(paymentAttempt).State = EntityState.Modified;
_auctionContext.SaveChanges();
于 2015-08-09T05:51:18.337 回答
1

我陷入了这个问题,但遇到了不同的问题。我发现,如果您在尚未修改的对象上调用 SaveChanges(),EF 将不会更新任何内容。这是有道理的,但我需要更新数据库,以便其他用户可以看到 SaveChanges() 已执行,无论是否有任何字段已更改。要在不更改任何字段的情况下强制更新:

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

我知道这已经晚了,但还有另一种解释值得一提。即使您的字段名称包含 ID 并且可能设置为自动增量,请务必确认您在表中将其声明为主键。

于 2021-03-23T16:18:55.670 回答