从DbSet <tentity>加载时,根据属性IsDeleted值排除实体

时间:2017-12-07 22:34:37

标签: c# entity-framework

我使用的是实体框架,在我的上下文中,我做过一些像:

public override int SaveChanges()
{
    foreach (var entry in ChangeTracker.Entries())
    {
        if (entry.Entity is Base entity)
        {
            if (entry.State == EntityState.Added)
            {
                entity.Created = DateTime.UtcNow;
                entity.Modified = DateTime.UtcNow;
            }
            else if (entry.State == EntityState.Modified)
            {
                entity.Modified = DateTime.UtcNow;
            }
        }
    }
    return base.SaveChanges();
}

Base的基础是:

    public int Id { get; set; }
    public DateTime? Created { get; set; }
    public DateTime? Modified { get; set; }
    public bool IsDeleted { get; set; }

现在我要做的是当我使用我的上下文加载属性时:

_context.MyEntities.AsEnumerable(something);

我希望它选择IsDeleted属性设置为false的所有实体。是否可以在DbContext中执行此操作,例如我通过覆盖SaveChanges()

进行更改

我可以看到有一种方法可以覆盖,但不知道如何去做:

public override DbSet<TEntity> Set<TEntity>()
{
    return base.Set<TEntity>();
}

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要在DbContext

中添加类似的内容
public DbSet<MyEntity> ExistingMyEntities {
    get { return MyEntities.Where(x => !x.IsDeleted); }
}

那么您可以根据需要使用上下文对象来检索未删除的实体。

<强>更新

您也可以通过IsDeleted过滤模型构建器(如果使用了软删除How can I automatically filter out soft deleted entities with Entity Framework?

public class MyContext : DbContext
{
    public virtual IDbSet<MyEntity> MyEntities { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyEntities>()
            .Map(m => m.Requires("IsDeleted")).HasValue(false).Ignore(m => m.IsDeleted);
    }
}

我被Ignore误导了,但正如Jan Muncinsky注意到可以使用HasValue方法进行过滤。