当在 EF Core 中使用 AsNoTracking 获取对象时,如何指定更新对象,但不更新其关系/导航?

问题描述 投票:0回答:1

我有这些桌子:

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;

但是,从我的角度来看,修改更改跟踪器并不是一个理想的解决方案。

有人知道如何解决这个问题吗?

c# entity-framework-core change-tracking
1个回答
0
投票

如果您有一个非跟踪实体,并且您希望在更新它们时仅保存更改的属性,则可以使用

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();
© www.soinside.com 2019 - 2024. All rights reserved.