2

タイトルはそれをすべて尋ねます。データベースには、「タイトルホルダー」などのスペースが含まれるドキュメントのタイトルを含むレガシーデータがあります。これらをFluentNHibernateの列挙型に直接マッピングできるようにしたいのですが、解析エラーが発生しています。使用できるカスタムコンバーターの兆候が見つかりませんでした。誰かができる推奨事項はありますか?

私のマッピングは次のようになります。

Map(x => x.DocumentName).Nullable().CustomSqlType("varchar(50)");
4

2 に答える 2

2

独自のNHibernateIUserTypeを実装する必要があり、ロジックの大部分はNullSafeGet()メソッドとNullSafeSet()メソッドにあります。

また、独自の内部列挙型から文字列へのマッピングを作成する必要があります。文字列をキーとして、列挙値を値として保持するディクショナリを使用できるため、ロジックは基本的に、そのディクショナリで値を検索して文字列から列挙型に、またはその逆に変換することを中心に展開します。別のオプションは、属性を使用して各列挙値をその名前の文字列バージョンで装飾し、実行時にリフレクションを使用して変換を行うことです...

カスタムIUserTypeを作成するいくつかの例を次に示します:(以下の最初のリンクは、実際に正しい方向を示しているはずです)

于 2012-11-19T19:41:25.880 に答える
1

データがデータベースから読み取られるときにスペースを取り除くカスタムタイプを記述して、変換された文字列を列挙型にマップすることができます。このアプローチの問題は、スペースをどこに戻すかわからないためにデータをデータベースに保存する場合です(スペースを戻す場所を追跡するスパゲッティコードに満足している場合を除く)。

または、データベースにマップされたプロパティの内容に基づいて列挙型を返す列挙型のクラスに追加のプロパティを設定することもできます。以下の例

public class Document
{

    public virtual string DocumentName {get; set;}

    public EDocumentName Name 
    {
        get 
        {
            if (DocumentName == "Title Holder")
            {
                return EDocumentName.TitleHolder;
            }
        }
        set
        {
            if(value == EDocumentName.TitleHolder)
            {
                DocumentName = "Title Holder";
            }
        }
    }
}

public enum EDocumentName
{
    TitleHoldder
}
于 2012-11-19T19:36:14.060 に答える