ORMLite / ServiceStack软删除

时间:2017-10-11 16:42:49

标签: servicestack ormlite-servicestack

好的,我已经发布了几次这方面的内容,但仍然没有找到一个有效的解决方案。我已经看过其他的例子/建议并跟着他们,但没有成功。我在绳子尽头,希望在这里明白。最终,我试图实现选择数据库中任何对象的能力,同时过滤“IsDeleted”#39; IsDeleted'标志。

我在服务堆栈中使用ORMLite。我使用存储库模式,并使用Funq和ServiceStack。当我的AppHost启动时,我在容器中注册了我的DbConnectionFactory,以及我的存储库实例。连接工厂通过构造函数注入传递。

public override void Configure(Container container)
{
    <...>

    container.Register<IDbConnectionFactory>(new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["connstring"].ConnectionString, SqlServerDialect.Provider));
    container.Register<ICompanyRepository>(c => new Repositories.OrmLite.CompanyRepository(container.Resolve<IDbConnectionFactory>()));

    <...>
}

我的所有模型类都有一个共同的基类/接口,其中包含我们的标准审计字段,以及&#39; IsDeleted&#39;旗。这由名为&#39; IAuditModel&#39;:

的界面表示
public interface IAuditModel
{
    int CreatedBy { get; set; }
    int ModifiedBy { get; set; }
    DateTime CreatedDateTime { get; set; }
    DateTime ModifiedDateTime { get; set; }
    bool IsModified { get; set; }
}

在我的存储库类中,我试图检索未标记为已删除的记录,但我试图避免在每个查询中指定此记录。我通过在基本存储库类的构造函数中为类型创建特定的选择过滤器来尝试这一点:

public class OrmLiteRepositoryBase : IRepositoryBase
{
    <...>

    protected readonly OrmLiteConnectionFactory olcf;

    public OrmLiteRepositoryBase(IDbConnectionFactory cf)
    {
        olcf = cf as OrmLiteConnectionFactory;

        SqlExpression<Vendor>.SelectFilter = q => q.Where(x => !x.IsDeleted);

        OrmLiteConfig.InsertFilter = (dbCmd, row) =>
        {
            <...>
        }

        OrmLiteConfig.UpdateFilter = (dbCmd, row) =>
        {
            <...>
        }

        <...>
    }
}

Vendor类通过基类实现IAuditModel。以上是我第一次尝试过滤特定类型。然后我按照我在stackoverflow上找到的建议以及github上的SoftDeleteUseCase来尝试下面的内容:

OrmLiteConfig.SqlExpressionSelectFilter = (q) =>
{
    if(q.ModelDef.ModelType.HasInterface(typeof(IAuditModel))
    {
        a.Where<IAuditModel>(x => x.IsDeleted);
    }
}

我已尝试在以下内容中包含此选择过滤器:

  1. 在app主机中注册连接工厂后。
  2. 在存储库构造函数中,InsertFilter所在的位置。
  3. 在存储库方法本身中,打开DbConnection。
  4. 我最终使用泛型方法在共享基类中进行查询,如下所示:

    db.Select<T>();
    

    没有任何作用,我每次都会收回所有记录(包括标记为&#39;已删除&#39;的记录)。有趣的是,如上所示,存储库构造函数中的InsertFilter和UpdateFilter正如我所期望的那样工作。我不能为我的生活让这个选择过滤器工作。调用&#39; GetLastSql()&#39;在&#39; Select()&#39;之后调用显示没有显示过滤器被应用的迹象。有人,有人,请帮助我理解这一点。感谢。

1 个答案:

答案 0 :(得分:1)

软删除过滤器将条件附加到SqlExpression,因此在其实现中附加only applies to APIs that use an SqlExpression,例如:

var results = db.Select(db.From<Table>());
var result = db.Single(db.From<Table>().Where(x => x.Name == "foo"));
var result = db.Single(x => x.Name == "foo");