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);
}
}
我试过,包括在以下这个选择滤波器:
- 在应用程序主机,注册连接工厂后。
- 在存储库构造函数中,InsertFilter所在的位置。
- 在存储库方法本身中,打开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");
感谢您的答复,mythz - 有次,我不能没有使用ServiceStack想象。这是那些我觉得在这个问题上我的头撞在墙上太久的时代之一。我正在更新我的问题,以包括我实际调用此查询的方式。改变我的方法: db。选择(); 到: db.Select(db.From ()); 确实使其工作。从呼叫的角度来看,它似乎有如此细微的差别。我可以看到生成的SQL包含过滤器,但是不允许第一种方法相同的原因是什么? –
StratMN
+0
相关文章
- 1. Symfony软删除
- 2. Hibernate 软删除
- 3. sprinboot 软删除
- 4. xorm-删除和软删除实例
- 5. ef core实现软删除
- 6. laravel5.2总结--软删除
- 7. Lucene 软删除 softDeletes(二)
- 8. 建立/删除软连接
- 9. Django soft-delete软删除
- 10. linux删除安装软件
- 11. mac彻底删除软件
- 12. Lucene 软删除 softDeletes(五)
- 13. Lucene 软删除 softDeletes(六)
- 14. 删除ZHPHFReader软件残留
- 15. spring boot实现软删除
- 16. adb删除系统软件
- 17. 彻底删除软件,删除注册列表信息
- 18. 没法删除的软件,如何删除
- 19. Harbor上镜像软删除和硬删除
- 20. 删除&&批量删除
- 21. tableview 删除row ,删除组
- 22. Linux 软件编译、安装、删除
- 23. Linux软连接建立及删除
- 24. 如何完全删除PPA软件库
- 25. 关于Domino数据库的软删除
- 26. Linux建立/删除软链接
- 27. 苹果电脑删除自带软件
- 28. 软连接新建、修改、删除
- 29. 恶意软件删除工具
- 30. 彻底删除linux 下的软件
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新问题
-
1. 转到代码编译链接器错误。我可以手动链接吗?
-
2. IE
-
3. 将PPCPCell添加到段落
-
4. 添加验证/如果其他语句公共类功能PHP
-
5. Python:按多列分组的值线图
-
6. 我不确定如何正确使用fscanf
-
7. 无法加载资源:服务器与404未找到
-
8. Typescript的/ ** @class * /是否有目的?
-
9. 测试十进制是否足够接近有理数
-
10. Android WifiManager - 以十六进制或不以十六进制
- 1. Symfony软删除
- 2. Hibernate 软删除
- 3. sprinboot 软删除
- 4. xorm-删除和软删除实例
- 5. ef core实现软删除
- 6. laravel5.2总结--软删除
- 7. Lucene 软删除 softDeletes(二)
- 8. 建立/删除软连接
- 9. Django soft-delete软删除
- 10. linux删除安装软件
@StratMN按我的回答是,因为SqlExpression过滤器只适用于使用'SqlExpression''这db.Select ()'没有的API。 –
mythz
相关问题