Entity framework 实体框架don';不要删除记录,而要填充列

Entity framework 实体框架don';不要删除记录,而要填充列,entity-framework,Entity Framework,我想改变EF删除记录的方式。 它不应该删除数据库中的行,而应该填充一列(GCColumn或其他) 检索数据时,应始终在GCColumn上筛选为NULL+应用的筛选器 有人知道这是否可以实现以及如何实现吗?在一个项目中,我们使用存储库模式访问数据库,每个实体都有自己的存储库 这是一个多租户数据库,我们使用您正在寻找的筛选器类型来筛选当前用户可访问的实体,而不是筛选删除标志,但该方法可以类似地使用 每个需要筛选的存储库都会获得一个筛选方法: private Expression<Func<

我想改变EF删除记录的方式。 它不应该删除数据库中的行,而应该填充一列(GCColumn或其他)

检索数据时,应始终在GCColumn上筛选为NULL+应用的筛选器


有人知道这是否可以实现以及如何实现吗?

在一个项目中,我们使用存储库模式访问数据库,每个实体都有自己的存储库

这是一个多租户数据库,我们使用您正在寻找的筛选器类型来筛选当前用户可访问的实体,而不是筛选删除标志,但该方法可以类似地使用

每个需要筛选的存储库都会获得一个筛选方法:

private Expression<Func<Order, bool>> RemoveDeleted
{
    get
    {
        return order => order.GCColumn == null;
    }
}

因此,现在您的业务逻辑可以有许多方法使用相同的GetAll()方法,使用不同的过滤器,但不必关心“已删除”实体。但是您仍然需要为每个存储库方法创建一个正确的过滤器

如果删除标志不在所有实体中,但删除状态已在其他实体中注册,则可以执行以下操作:

private Expression<Func<Order, bool>> RemoveDeleted
{
    get
    {
        return orderLine => orderLine.Order.GCColumn == null;
    }
}
删除私有表达式
{
得到
{
return orderLine=>orderLine.Order.gcolumn==null;
}
}

在这个例子中,命令被全部删除,而不是单独的行。

< P>我除了上面的回答之外,考虑许多甚至所有的实体都有这个GcLoad的情况。

您可以从这些伪可删除实体的基本实体开始:

public abstract class PseudoDeletable
{
    public DateTime GCColumn { get; set;}
}
并将实体定义为:

public class Order : PseudoDeletable
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public DateTime OrderDate { get; set; }
    // etc.
}
然后,您可以创建一个通用的基本存储库

public class RepositoryBase<TEntity> where TEntity : PseudoDeletable
{
    protected IDbSet<TEntity> DbSet { get; }

    public RepositoryBase()
    {
        DbSet = context.Set<TEntity>();
    }

    private Expression<Func<TEntity, bool>> RemoveDeleted
    {
        get { return e => e.GCColumn == null; }
    }

    public virtual IEnumerable<TEntity> GetAll(Expression<Func<TEntity, bool>> expression)
    {
        expression = expression.And(RemoveDeleted);
        return DbSet.Where(expression).ToList();
    }
}
它只会返回尚未删除的订单


请注意,对于相关记录,您会遇到一个问题:如何仅包括未删除的相关实体,但这是您希望在数据库中保留“已删除”记录的结果。

所以它实际上是一个更新而不是删除?并选择一个预定义的过滤器。让我看看你迄今为止尝试了什么我还没有尝试过任何东西,我想知道是否有一个现成的解决方案。我正在考虑添加efhook并用它来修复它。但为什么现在要使用EF提供的方法呢。为什么要使系统复杂化如果您已经有了一个解决方案(在本例中是简单的),那么当数据库中的数据仍然可用时,您可以恢复某些操作。现在我想了想,也许我不应该像这样修复它。这被称为安全防护,如果您使用SQL Server 2016或更高版本,您可以应用中描述的方法。谢谢,我将尝试并实现此功能!
public abstract class PseudoDeletable
{
    public DateTime GCColumn { get; set;}
}
public class Order : PseudoDeletable
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public DateTime OrderDate { get; set; }
    // etc.
}
public class RepositoryBase<TEntity> where TEntity : PseudoDeletable
{
    protected IDbSet<TEntity> DbSet { get; }

    public RepositoryBase()
    {
        DbSet = context.Set<TEntity>();
    }

    private Expression<Func<TEntity, bool>> RemoveDeleted
    {
        get { return e => e.GCColumn == null; }
    }

    public virtual IEnumerable<TEntity> GetAll(Expression<Func<TEntity, bool>> expression)
    {
        expression = expression.And(RemoveDeleted);
        return DbSet.Where(expression).ToList();
    }
}
public class OrderRepository : RepositoryBase<Order>
{
}
new orderRepository().GetAll(x => x.ProductId == 1);