实体框架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没有跟踪物体之类的问题,我预计会发生故障,但没有发生这样的错误。
这是因为您需要将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);
如果没有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并且可能设置为自动递增,也要确保验证您在表中将其声明为主键。