2

ServiceStack.Ormliteを使用していますが、列挙型の自動処理を頻繁に使用するため、dbとして文字列として格納されます。私は簡単な型比較を行うことができます。たとえば、enum型 "UserRoleEnum"(デモンストレーション用)のdb/tableクラス "User"のプロパティ "UserRole"に対してです。Servicestack Ormlite複数列の制約が失敗します。制約にEnumが含まれている場合

私は同じよう

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

複数カラムのユニーク制約を定義する列挙型のプロパティを使用するまで、これは...素晴らしい作品:(: How to Create Unique Constraint with Multiple Columns using ServiceStack.OrmLite?ごとなど)

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

は、その時点で私が取得:

a)の表のエンティティ・クラス内の文字列(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属性を使用して複数列の一意制約を宣言することはできません。おそらくかわいいe後続のdb移行スクリプトを使用してこれらを手動で作成しますか?

列挙型と複数列の制約を、すぐに使用できるようにする方法はありますか? enumプロパティはSQL Serverはstringプロパティの列定義がVARCHAR(8000)ある一方で、インデックスを作成することはできませんVARCHAR(MAX)のデフォルトの文字列定義のフォールバックを使用していたので、

答えて

3

この問題はでした。

この問題は現在this commitから解決され、VARCHAR(255)EnumConverterタイプコンバータの文字列定義が使用されるようになりました。この変更はv4.5.5から入手できます。現在はavailable on MyGetです。

そうでなければ、あなたも例えば、[StringLength]属性を追加することにより、stringプロパティと一致する列定義のサイズを変更することができます。

[CompositeIndex(true, nameof(UserId), nameof(UserRole))] 
public class User 
{ 
    public long UserId { get; set; } 
    [StringLength(8000)] 
    public string UserRole { get; set; } 
} 
関連する問題