如何使用 DbModelBuilder 和数据库优先方法来实现软删除

Posted

技术标签:

【中文标题】如何使用 DbModelBuilder 和数据库优先方法来实现软删除【英文标题】:How to use DbModelBuilder with Database First Approach to implement Soft Delete 【发布时间】:2016-02-20 21:28:30 【问题描述】:

我正在尝试在我们的 EF 6 项目中实现软删除。我们使用的是数据库优先方法,我注意到您不能覆盖 OnModelCreating

使用 Code-First 方法时,可以对特定实体应用全局过滤器,如 blog post 中所述。

如何使用 Database First 方法重新创建它?

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);
    

【问题讨论】:

一种解决方法是使用 SQL 视图过滤掉软删除的记录。然后使用 View 作为您的数据库优先模型。 【参考方案1】:
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);

        base.OnModelCreating(modelBuilder);
    

你需要编写 base.OnModelCreating(modelBuilder);建立你的查询,我还在帖子中突出显示了一行。

【讨论】:

以上是关于如何使用 DbModelBuilder 和数据库优先方法来实现软删除的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭实体框架 5 的复数表创建?

SQLServer性能调优如何定位和解决

路径规划。求解题思路!!!通过给出点和路径,计算最优路径。如何避免环路?

如何使用最优查询自动重现相同的结果集?

EF CodeFirst系列---FluentApi

SQL调优如何生成海量测试数据