오케이, 이것에 관해 몇 번 게시했는데 아직 아직 해결 방법이 없습니다. 나는 다른 예제/제안을 보았고 그들을 따라 갔으며 성공하지 못했습니다. 나는 나의 밧줄의 끝 부분에 있고, 여기에서 명확성을 얻기를 바란다. 궁극적으로, 나는 'IsDeleted'플래그를 필터링하는 동안 데이터베이스의 모든 개체를 선택할 수있는 기능을 구현하려고합니다.ORMLite/ServiceStack 소프트 삭제
ServiceStack에서 ORMLite를 사용하고 있습니다. 나는 저장소 패턴을 사용하고 있으며 Funst를 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를'플래그를 포함하는 공통 기본 클래스/인터페이스를 가지고있다. 내 저장소 클래스에서
public interface IAuditModel
{
int CreatedBy { get; set; }
int ModifiedBy { get; set; }
DateTime CreatedDateTime { get; set; }
DateTime ModifiedDateTime { get; set; }
bool IsModified { get; set; }
}
, 나는 삭제 된 것으로 표시되지 않은 레코드를 검색하려고 해요,하지만 난 모든에이를 지정하는 것을 피하기 위해 노력하고있어 : 이것은 'IAuditModel'라는 이름의 인터페이스에 의해 표현된다 질문. 나는 기본 저장소 클래스의 생성자에서 유형에 대한 특정 선택 필터를 만들어이 시도했습니다
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를 구현합니다. 위의 내용은 특정 유형을 필터링하는 첫 시도였습니다. 나는 그 GitHub의에 SoftDeleteUseCase뿐만 아니라, 여기에 유래에서 발견 제안 다음, 아래의 시도 다음에
- : 나는 다음이 선택 필터를 포함하여 시도했습니다
OrmLiteConfig.SqlExpressionSelectFilter = (q) => { if(q.ModelDef.ModelType.HasInterface(typeof(IAuditModel)) { a.Where<IAuditModel>(x => x.IsDeleted); } }
app 호스트에 연결 팩토리를 등록한 후
- InsertFilter가 위치한 저장소 생성자에서.
- 리포지토리 메서드 자체에서 DbConnection을 연 후.
db.Select<T>();
아무것도 내가 ('삭제'으로 표시된 것을 포함) 모든 다시 모든 레코드를 얻을 작동하지 않습니다 다음과 같이 내가 궁극적으로 일반적인 방법으로 공유 기본 클래스에 쿼리를 만들고있어
시각. 저장소 생성자에서 위에 표시된 InsertFilter 및 UpdateFilter가 예상대로 작동한다는 점에 흥미가 있습니다. 나는이 삶의 선택 필터를 작동시킬 수 없다. 'Select()'호출이 수행 된 후 'GetLastSql()'을 호출하면 적용되는 필터의 표시가 나타나지 않습니다. 누군가, 아무도, 제발 좀 이해가 좀 도와주세요. 감사.
덕분에, mythz - 나는 ServiceStack를 사용하지 상상할 수없는 시간이 있습니다. 이것은 내가이 이슈에 대해 너무 오랫동안 벽에 머리를 두드리는 것처럼 느껴지는 그 시대의 하나이다. 나는이 쿼리를 실제로 호출하는 방법을 포함하도록 내 질문을 업데이트하고 있습니다. 내 접근 방식 변경 : db.()을 선택하십시오. to : db.Select (db.From
()); 실제로 작동합니다. 그것은 호출의 관점에서, 비록 사소한 차이처럼 보인다. 생성 된 SQL에 필터가 포함되어 있음을 알 수 있지만 첫 번째 접근 방식을 동일하게 허용하지 않는 이유는 무엇입니까? – StratMN@StratMN SqlExpression 필터는'db.Select()'이 사용하지 않는'SqlExpression '을 사용하는 API에만 적용되기 때문에 제 답변대로입니다. –
mythz
관련 문제