我有这些桌子:
public class Order
{
public long Id { get; set; }
public long CustomerId { get; set; }
// ...
public virtual Customer Customer { get; set; }
}
public class Customer
{
public long Id { get; set; }
public long Name{ get; set; }
// ...
public virtual Wallet Wallet { get; set; }
}
public class Wallet
{
public long Id { get; set; }
public long CustomerId { get; set; }
// ...
}
我用
.AsNoTracking()
获取所有对象,每当我想更新它们时,我只需调用 Update
函数并告诉更改跟踪器再次跟踪它们。
var order = await DbContext.Orders.AsNoTracking().FirstOrDefaultAsync(x => x.Id == 5);
...
order.Quantity = 15;
await DbContext.Orders.Update(order);
await SaveChanges();
一开始,变更跟踪器中没有任何内容,但是当我打电话给
await DbContext.Orders.Update(order)
并要求仅更新订单后,变更跟踪器中就会出现三个对象:订单、客户和钱包。
我的问题是当我们调用更新函数时如何防止跟踪关系?
我用
.AsNoTrackingWithIdentityResolution()
代替 .AsNoTracking()
,但没有任何改变。
我知道我可以使用
UnitOfWork.DbContext.Entry(order).State = EntityState.Modified;
仅指定要跟踪的顺序,或者我可以分离我不希望被跟踪的额外对象。
UnitOfWork.DbContext.Entry(customer).State = EntityState.Detached;
UnitOfWork.DbContext.Entry(wallet).State = EntityState.Detached;
但是,从我的角度来看,修改更改跟踪器并不是一个理想的解决方案。
有人知道如何解决这个问题吗?
如果您有一个非跟踪实体,并且您希望在更新它们时仅保存更改的属性,则可以使用
SaveValues
方法。
var order = await DbContext.Orders.AsNoTracking().FirstOrDefaultAsync(x => x.Id == 5);
...
order.Quantity = 15;
var trackedOrder = await DbContext.Set<Order>().FindAsync(order.Id);
DbContext.Entry(trackedOrder).CurrentValues.SetValues(order);
await SaveChanges();