Entity Framework 6.1 - 如何查询软删除记录?

Entity Framework 6.1 - how can you query soft deleted records?

我正在使用代码优先 Entity Framework 6.0,并且已经实现了基于 https://putshello.wordpress.com/2014/08/20/entity-framework-soft-deletes-are-easy/ 的软删除解决方案。这很好用并自动忽略 IsDeletedtrue 的记录。所以我的模型构建器有一个类似于以下的条目:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>()
        .Map(m => m.Requires("IsDeleted").HasValue(false))
        .Ignore(m => m.IsDeleted);
}

我现在需要访问已删除的记录,但只能在应用程序的一个部分中访问。所以我需要 select IsDeleted 为真的记录。

如果我尝试简单地使用:

    where company.IsDeleted = true

它将失败并显示以下消息:

The specified type member 'IsDeleted' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

我到处都看了,有很多关于 Entity Framework Core 2.0 的信息,但没有关于 EF6.1 的信息。没有将 SQL 脚本与旧的 SqlClient 一起使用,有没有人知道如何使用 linq to entities 访问这些记录?

最终,轻松解决此问题的唯一方法是从 https://github.com/zzzprojects/EntityFramework.DynamicFilters 实施 EntityFramework.DynamicFilters。这是一个很好的解决方案,可以灵活地动态关闭过滤器。

protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
    modelBuilder.Filter( "IsDeleted", ( ISoftDelete d ) => d.IsDeleted, false ));
}

然后你添加一个接口:

internal interface ISoftDelete
{
    bool IsDeleted { get; set; }
}

然后,关闭(根据需要)IsDeleted 过滤器:

ctx.DisableFilter( "IsDeleted" );

轻松多了!