Entity framework core 实体框架核心:数据更改后全局查询筛选器未正确筛选
我们使用EntityFramework核心实现了一个软删除模式,非常类似于,但使用了一个可为空的列“DeleteDate”,而不是IsDeleted标志。如果填写了日期,则认为该行已删除并已过滤掉: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
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吗。我尝试保存更改,但结果是一样的。