我正在使用代码优先的Entity Framework 6.0,并且已实现基于https://putshello.wordpress.com/2014/08/20/entity-framework-soft-deletes-are-easy/的软删除解决方案。这样效果很好,并且会自动忽略IsDeleted
为true
的记录。因此,我的模型构建器具有类似于以下内容的条目:
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到实体访问这些记录吗?
答案 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" );
容易得多!