C# 实体框架6.1-如何查询软删除记录?
我正在使用CodeFirstEntityFramework 6.0,并基于实现了一个软删除解决方案。这样做效果很好,并且会自动忽略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
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" );