【发布时间】:2018-09-29 05:58:42
【问题描述】:
我们使用 Entity Framework Core 实现了软删除模式,与 this solution 非常相似,但使用可空列“DeleteDate”而不是 IsDeleted 标志。如果填写了日期,则认为该行已删除并被过滤掉:
modelBuilder.Entity<TEntity>().HasQueryFilter(e => !EF.Property<DateTime?>(e, "SysDeletedOn").HasValue);
以下代码位将在这样做时更新一项,删除其子元素之一,但在返回的项中,仍将包含已删除的子元素。只有对所有项目的新查询才能正确过滤子集合。
public async Task<Item> UpdateItemAsync(ItemDto itemDto)
{
var itemEntity = await _context.Items.SingleOrDefaultAsync(i => i.Id == itemDto.Id);
if(itemEntity != null)
{
return;
}
// Update item's properties here
// ...
foreach (var child in itemDto.Children)
{
// Update child here
// ...
}
foreach (var child in itemDto.RemovedChildren)
{
var childEntity = await itemEntity.SingleOrDefaultAsync(i => i.Id == child.Id);
_context.Remove(childEntity);
}
await _context.SaveChangesAsync();
// Read and return updated item
return await _context.Items.SingleOrDefaultAsync(i => i.Id == itemDto.Id);
}
现在的问题是:在进行此更改(删除)后,如何在此方法中获取正确的列表?我是否必须在 SaveChangesAsync 和再次读取上下文之间以某种方式清除缓存?
正确返回项目的定期更新(属性值)。此外,当我使用 .AsNoTracking() 查询项目时,它显然也关闭了缓存。
【问题讨论】:
-
那你的问题是什么?
-
谢谢@viveknuna,我用一个具体的问题更新了它。
-
你能用 SaveChanges 代替 SaveChangesAsync
-
感谢@viveknuna 的建议。我尝试了 SaveChanges,但结果是一样的。