【问题标题】:Use custom where clause on EF's Lazy Loading在 EF 的延迟加载中使用自定义 where 子句
【发布时间】:2015-03-14 01:21:02
【问题描述】:

我遇到了以下问题:

在这个项目中,注册表不应该被物理地(从数据库中)删除,因此我在每个代表数据库中的表的类上创建了一个名为 deleted 的 bool 属性。

在删除的情况下,该属性将变为 true,并且在任何情况下都只能由数据库内的 SQL 查询访问。

我使存储库等始终返回带有query.where(x => !x.Deleted)IQueryables,但是如何在EF“延迟加载”的Collections 上执行此操作?

例如,当我得到一个 Person 并且它有一个 ICollection 时,它总是填充有链接到该 Person 的所有对象,我总是必须手动过滤已删除的对象。

有没有办法告诉 EF 在每次延迟加载中都应该使用自定义 where 子句?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您可以在映射DbSet 本身时过滤掉已删除的实体,方法是覆盖OnModelCreating

    例子:

    public class MyContext : DbContext
    {
        public virtual IDbSet<Company> Companies { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Company>()
                .Map(m => m.Requires("IsDeleted").HasValue(false))
                .Ignore(m => m.IsDeleted);
        }
    }
    

    这将为IsDeleted 属性设置默认值false,并过滤掉IsDeleted 为真的记录。

    更多信息:https://putshello.wordpress.com/2014/08/20/entity-framework-soft-deletes-are-easy/

    【讨论】:

    • 天哪,这行得通!可能我在搜索错误的关键字,我从来没有想过“软删除”这个词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    相关资源
    最近更新 更多