2

ServiceStack.Ormlite를 사용하고 있으며 열거 형의 자동 처리를 많이 사용하므로 db로 문자열로 저장되지만 검색되고 구문 분석되어 Enums on 검색, 그래서 쉽게 타입 비교를 할 수 있습니다 - 예를 들어, "UserRoleEnum"열거 형 (단지 데모)의 db/table 클래스 "User"의 "UserRole"속성에 대해 말합니다. 내가 유일 컨 스트레인 트에게 다중 열을 정의하는 열거 속성을 사용할 때까지Servicestack 제약 조건이 Enum을 포함하는 곳에서 Ormlite 다중 열 제약 조건이 실패합니다.

이 .. 잘 작동

CompositeIndexAttribute(bool unique, params string[] fieldNames); 

같은 :

[CompositeIndex(true, nameof(UserId), nameof(UserRole)] 
public class User 
{ 
    public long UserId {get;set;} 
    public UserRoleEnum UserRole {get;set; 
} 

(당 : How to Create Unique Constraint with Multiple Columns using ServiceStack.OrmLite?).

은 당시 내가 얻을 :

가) 테이블 엔티티 클래스의 문자열 (UserRoleEnum의 isntead)로 UserRole을 정의하고 열거를 사용하지 못할 :

System.Data.SqlClient.SqlException 
Column 'UserRole' in table 'User' is of a type that is invalid for use as a key column in an index. 

나는 현재로 옵션을 참조하십시오. ... db 값이 비즈니스 로직에서 나중에 예상하는 값임을 확인하기 위해 매번 값을 수동으로 테스트해야합니다.

b) 계속해서 UserRoleEnum을 사용하지만 class 속성을 사용하여 여러 열의 uniqueconstraints를 선언 할 능력을 잃고, 아마도 근래에 e 후속 db 마이그레이션 스크립트를 사용하여 수동으로 생성 하시겠습니까?

열거 형 및 다중 열 제약을 즉시 사용할 수있는 방법이 있습니까? enum 속성 VARCHAR(MAX)의 기본 문자열 정의 대체를 사용하고 있기 때문에

답변

3

이 문제는이 string 속성의 열 정의가 VARCHAR(8000) 반면에 인덱스를 생성하지 않는 SQL 서버이었다.

이제이 문제는 this commit에서 해결되었으므로 VARCHAR(255)EnumConverter 형식 변환기의 문자열 정의를 사용합니다. 이 변경 사항은 v4.5.5에서 제공되며 지금은 available on MyGet입니다.

[CompositeIndex(true, nameof(UserId), nameof(UserRole))] 
public class User 
{ 
    public long UserId { get; set; } 
    [StringLength(8000)] 
    public string UserRole { get; set; } 
} 
:

그렇지 않으면 당신은 또한 [StringLength] 특성, 예컨대을 추가하여 string 속성과 일치하는 열 정의의 크기를 변경할 수 있습니다