ORMLite/ServiceStack软删除

问题描述:

好的,我已经发布了几次这方面的情况,并且还没有找到可行的解决方案。我见过其他的例子/建议,并且跟着他们,并没有成功。我在我的绳索末端,希望在这里获得澄清。最终,我试图实现在数据库中选择任何对象的能力,同时过滤'IsDeleted'标志。ORMLite/ServiceStack软删除

我正在使用带有ServiceStack的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>())); 

    <...> 
} 

我所有的模型类都有一个共同的基类/接口,它包含我们的标准审计字段以及'IsDeleted'标志。这是通过一个名为接口来表示“IAuditModel”:

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) => 
     { 
      <...> 
     } 

     <...> 
    } 
} 

的供应商类别通过一个基类实现IAuditModel。以上是我第一次尝试过滤特定类型。然后,我尝试下,下面的建议我在计算器在这里找到,以及在SoftDeleteUseCase在GitHub上:

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

我试过,包括在以下这个选择滤波器:

  1. 在应用程序主机,注册连接工厂后。
  2. 在存储库构造函数中,InsertFilter所在的位置。
  3. 在存储库方法本身中,打开DbConnection之后。

我最终使查询在一个共享的基类与泛型方法如下:

db.Select<T>(); 

没有什么工作,我得到的所有记录回(包括标记为“已删除”的)每时间。有趣的是,上面显示的存储库构造函数中的InsertFilter和UpdateFilter如我所期望的那样工作。我不能为我的生活得到这个选择过滤器的工作。在进行'Select()'调用之后调用'GetLastSql()'表明没有应用过滤器的符号。有人,任何人,请帮我理解这一点。谢谢。

软删除过滤器附加条件,在其实施的SqlExpression因此only applies to APIs that use an SqlExpression,e.g:

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"); 
+0

感谢您的答复,mythz - 有次,我不能没有使用ServiceStack想象。这是那些我觉得在这个问题上我的头撞在墙上太久的时代之一。我正在更新我的问题,以包括我实际调用此查询的方式。改变我的方法: db。选择(); 到: db.Select(db.From

()); 确实使其工作。从呼叫的角度来看,它似乎有如此细微的差别。我可以看到生成的SQL包含过滤器,但是不允许第一种方法相同的原因是什么? – StratMN
+0

@StratMN按我的回答是,因为SqlExpression过滤器只适用于使用'SqlExpression ''这db.Select ()'没有的API。 – mythz