Entity framework core 实体框架核心:数据更改后全局查询筛选器未正确筛选

Entity framework core 实体框架核心:数据更改后全局查询筛选器未正确筛选,entity-framework-core,Entity Framework Core,我们使用EntityFramework核心实现了一个软删除模式,非常类似于,但使用了一个可为空的列“DeleteDate”,而不是IsDeleted标志。如果填写了日期,则认为该行已删除并已过滤掉: modelBuilder.Entity<TEntity>().HasQueryFilter(e => !EF.Property<DateTime?>(e, "SysDeletedOn").HasValue); modelBuilder.Entity().haskque

我们使用EntityFramework核心实现了一个软删除模式,非常类似于,但使用了一个可为空的列“DeleteDate”,而不是IsDeleted标志。如果填写了日期,则认为该行已删除并已过滤掉:

modelBuilder.Entity<TEntity>().HasQueryFilter(e => !EF.Property<DateTime?>(e, "SysDeletedOn").HasValue);
modelBuilder.Entity().haskqueryfilter(e=>!EF.Property(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);
}
public异步任务UpdateItemAsync(ItemDto ItemDto)
{
var itemmentity=wait_context.Items.SingleOrDefaultAsync(i=>i.Id==itemDto.Id);
if(itemEntity!=null)
{
返回;
}
//在此处更新项目的属性
// ...
foreach(itemDto.Children中的变量child)
{
//在这里更新孩子
// ...
}
foreach(itemDto.RemovedChildren中的变量child)
{
var childEntity=await itemtentity.SingleOrDefaultAsync(i=>i.Id==child.Id);
_删除(子实体);
}
wait_context.SaveChangesAsync();
//读取并返回更新的项目
返回wait _context.Items.SingleOrDefaultAsync(i=>i.Id==itemDto.Id);
}
现在的问题是:在进行此更改(删除)后,如何在此方法中获得正确的列表?我是否必须在
savechangessync
和再次读取上下文之间以某种方式清除缓存


正确返回项目的常规更新(属性值)。此外,当我使用
.AsNoTracking()
查询项目时,它也会起作用,这显然也会关闭缓存。

基于链接的解决方案,您还需要分离(即停止跟踪)成功保存到DB的任何实体,并使用非空
SysDeletedOn

public override ...int SaveChanges...
{
    OnBeforeSaving();
    var result = base.SaveChanges(...);
    OnAfterSaving();

    return result;
}

private void OnAfterSaving()
{
    // you want entries for objects that have the soft delete column
    //   and whose current value for said property is not null
    // this is one way to do it if the property name is always the same
    //   but it isn't necessarily the most efficient
    //   (e.g. if there is a base type or interface for the soft delete
    //    property you can check that)
    var entries = this.ChangeTracker.Entries()
        .Where( ee => ee.Properties.Any( prop =>
            prop.Metadata.Name == "SysDeletedOn"
            && prop.CurrentValue != null ) );

    foreach( var entry in entries )
    {
        // tracked entity is soft deleted and we want to remove it from the context
        entry.State = EntityState.Detached;
    }
}

那么你的问题是什么?谢谢,@viveknuna,我用一个具体的问题更新了它。你能试着用SaveChanges代替SaveChanges吗。我尝试保存更改,但结果是一样的。