2012-10-06 4 views
9

ServiceStack OrmLite는 기본 열과 계산 열을 정확히 처리합니까? ServiceStack OrmLite - 기본 및 계산 열 처리

은 특히 나는 오류

The column "PointsAvailable" cannot be modified because it is either a computed column or is the result of a UNION operator. 

이 열은 SQL 서버 2008 데이터베이스에서 계산 된 열로 구성된납니다.

OrmLite는 '[ServiceStack.DataAnnotations.Compute]'속성을 모델의 속성에 추가 할 수 있으므로 계산 된 열과 함께 처리하는 것처럼 보입니다.

코드로 이동하면 'OrmLiteDialetBase.cs'의 'ToInsertRowStatement'함수가 호출됩니다. 이 함수는 AutoIncrement 속성이 설정되어 있는지 확인하는 동안 IsComputed 속성이 설정되어 있는지 확인하지 않습니다.

버그인지 아니면 잘못 사용하고 있는지 알 수 없습니다.

+0

나는 IsComputed에 대한 수표를 추가하려고합니다. 문제가 해결되면 bugfix로 github에 풀 요청을 만듭니다. ServiceStack은 잘 구성된 프로그램이므로이 검사가 발생할 수있는 곳이 여러 개있을 것 같지 않습니다. – theMayer

+0

이전 주석을 명확하게하기 위해 소스 코드에서이 작업을 수행 한 다음 이진 파일을 다시 컴파일하십시오. 약 5 분 이상 걸리지 않아야합니다. – theMayer

답변

0

나는 테이블에서 관련 열 (계산 된 열 제외)이있는 뷰를 만들고 대신 뷰에서 작업합니다. 이렇게하면 원치 않는 계산 열에 대한 참조를 피할 수 있습니다. 단순보기는 삽입, 삭제, 업데이트 및 대부분의 다른 측면과 관련하여 일반 표와 동일한 방식으로 처리 될 수 있습니다. 단지 서비스 계층에서 계산 내 계산 열 들어

+0

그건 좀 ... 해키 야. ServiceStack에 내장 된 방법이 있기를 바랬습니다. – John

+0

@john 현재 ServiceStack OrmLite에서 어떤 종류의 버그가 발생하고있는 것 같습니다. 나는 당신의 도구를 고칠 수 없기 때문에 해결 방법이 차선책이어야합니다. 이것이 제 대안 인 것입니다. 그렇지 않으면 OrmLite를 만든 사람에게 연락하여 수정을 요청할 수 있습니다. –

6

는 SQL은 그들에 대해 아무것도 알고, 그래서 servicestack 모델에 대한 다음과 같은 속성의 조합을 사용 :

[Compute, ServiceStack.DataAnnotations.Ignore] 
public List<MyModel> MyList {get;set;} 

의 차이는 것 같다을 이름 공간이 붙어있는 것을 주장하는 "무시"속성 ??. 이것들을 사용하면 기본 쿼리가 실행됩니다. 그렇지 않으면 SQL은 열이 존재하지 않는다고 불평합니다.

t-clausen.dk에서 제안한 것처럼 원하는 모든 열 이름을 가진 SQL CommandText 문자열을 특별히 전달하여 SQL 필터를 사용할 수는 있지만 유지 관리 문제가 발생할 수 있습니다.

데이터베이스를 살펴볼 때 SQL은 "toSqlString()"또는 비슷한 방법으로 공급자별로 생성 된 것으로 보입니다. 따라서 관심을 가질만한 곳이 몇 군데 있습니다.

EDIT : 작업을 수행하는 Ignore 속성입니다. 출처 :

/// IgnoreAttribute 
/// Use to indicate that a property is not a field in the table 
/// properties with this attribute are ignored when building sql sentences 

내가 탐구하지 않은 앨리어스도 사용할 수있는 옵션이 있습니다.