EntityEntry.OriginalValues.ToObject() is the same as EntityE



我只是尝试用方法projeleriguncell更新一个实体下面。

当我试图在重写SaveChangesAsync中访问对象的原始值时与EntityEntry.OriginalValues.ToObject (),我看到对象包含当前值而不是旧值。

我错过了什么吗?我期望clonedTypedEntity获取更新前的值。

public async Task<ActionResult<int>> ProjeleriGuncelle(Proje proje)
{
var projeFound = DataContext.Projeler.AsNoTracking().FirstOrDefault(p => p.EntegrasyonId == proje.EntegrasyonId);
var entry = DataContext.Entry<Proje>(projeFound);
//Database entry is updated with the proje object as expected
entry.CurrentValues.SetValues(proje);
entry.State = EntityState.Modified;
await DataContext.SaveChangesAsync();
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
{
ChangeTracker.DetectChanges();
var modifiedEntries = this.ChangeTracker.Entries();
foreach (var modifiedEntry in modifiedEntries)
{
//modifiedEntry.OriginalValues.ToObject() returns the object with the currrent values instead of the original values before update
if (modifiedEntry.OriginalValues.ToObject() is not IVersionable clonedTypedEntity) continue;
clonedTypedEntity.Id = 0;
clonedTypedEntity.UstSurumId = (modifiedEntry.Entity as IVersionable)?.Id;
Add(clonedTypedEntity);
}
return base.SaveChangesAsync(cancellationToken);
}

更新:

当我删除AsNoTracking()当查询projeffound时,modifiedEntry.OriginalValues.ToObject()实际返回更新前的值。但是我不理解这种行为,因为使用var entry = DataContext.Entry<Proje>(projeFound);语句,我希望跟踪entry对象,并通过使用entry.CurrentValues.SetValues(proje);更新它,我希望能够访问原始值。

对于EF,原始值是它开始跟踪时的值,这是当entry.State = EntityState.Modified;被调用时的值。EF忽略了前一行代码中发生的更改。

你可以通过交换这两行来解决:

entry.State = EntityState.Modified; // attaches and stores original values
entry.CurrentValues.SetValues(proje);

一个改进是附加条目,让更改跟踪器找出实体是否真的被修改了。

entry.State = EntityState.Unchanged; // attaches and stores original values
entry.CurrentValues.SetValues(proje);

现在SetValues只将实际更改的属性标记为已修改,更新语句可以更精简,甚至根本不发生。

我有同样的问题,在这几天....在我的Dbcontext中,我设置了这个属性:

ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

此属性禁用所有跟踪,并且您不能拥有它们的OriginalValue。

相关内容

最新更新