实体框架6.1-如何查询软删除的记录?

时间:2019-04-01 14:42:39

标签: c# entity-framework linq ef-code-first

我正在使用代码优先的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);
}

我现在需要访问已删除的记录,但只能在应用程序的一部分中访问。因此,我需要选择IsDeleted为真的记录。

如果我尝试简单地使用:

    where company.IsDeleted = true

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

  

LINQ to Entities不支持指定的类型成员'IsDeleted'。仅支持初始化程序,实体成员和实体导航属性。

我到处都看过,并且有很多关于Entity Framework Core 2.0的信息,但是没有关于EF6.1的信息。除了在旧的SqlClient中使用SQL脚本之外,没有人暗示如何使用linq到实体访问这些记录吗?

1 个答案:

答案 0 :(得分:0)

最后,轻松解决此问题的唯一方法是从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" );

容易得多!