实体框架SaveChanges()未更新数据库

本文关键字:更新 数据库 框架 SaveChanges 实体 | 更新日期: 2023-09-27 17:59:19

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

被称为CCD_ 1的CCD_。为什么会这样?这真的很令人沮丧。也没有错误。如果出现EF没有跟踪物体之类的问题,我预计会发生故障,但没有发生这样的错误。

实体框架SaveChanges()未更新数据库

这是因为您需要将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);

如果没有Entry,请尝试添加:

using System.Data.Entity.Infrastructure;
using System.Data.Entity;

那么你可以简单地使用:

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

我遇到了这个问题,但遇到了另一个问题。我发现,如果对未修改的对象调用SaveChanges((,EF将不会更新任何内容。这是有道理的,但我需要更新DB,这样其他用户就可以看到SaveChanges((已经执行,而不管是否有任何字段发生了更改。在不更改任何字段的情况下强制更新:

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

我知道这很晚了,但还有另一种解释值得一提。即使您的字段名称包含ID并且可能设置为自动递增,也要确保验证您在表中将其声明为主键。