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

C# 实体框架6.1-如何查询软删除记录?,c#,entity-framework,linq,ef-code-first,C#,Entity Framework,Linq,Ef Code First,我正在使用CodeFirstEntityFramework 6.0,并基于实现了一个软删除解决方案。这样做效果很好,并且会自动忽略IsDeleted为true的记录。因此,我的模型生成器有一个类似于以下内容的条目: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Company>() .Map(m => m.Require

我正在使用CodeFirstEntityFramework 6.0,并基于实现了一个软删除解决方案。这样做效果很好,并且会自动忽略
IsDeleted
true
的记录。因此,我的模型生成器有一个类似于以下内容的条目:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>()
        .Map(m => m.Requires("IsDeleted").HasValue(false))
        .Ignore(m => m.IsDeleted);
}
它将失败,并显示以下消息:

LINQ to实体中不支持指定的类型成员“IsDeleted”。仅支持初始值设定项、实体成员和实体导航属性


我到处都看了,有很多关于EntityFrameworkCore2.0的信息,但没有关于EF6.1的信息。除了在旧的SqlClient中使用SQL脚本之外,还有人知道如何使用linq访问这些记录吗?

最后,唯一容易解决的方法是从中实现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" );

容易多了

您正在映射中将IsDeleted设置为忽略
.Ignore(m=>m.IsDeleted),我相信这会导致您遇到的问题。这是正确的。此设置按预期工作。我只需要为应用程序的一个部分关闭它。我以前遇到过这个问题,它的发生是因为我的映射。你可以检查这个,它可能会帮助你。一旦建立了fluent映射,就没有办法忽略它。我所能想到的就是创建另一个
DbContext
派生类,没有流畅的配置。
ctx.DisableFilter( "IsDeleted" );