1

レガシー データベースを使用しており、特定のテーブルを使用してマップを作成しようとしています。

ユーザーのプロファイルがあり、プロファイルには連絡先チャネルへの参照があります。ただし、ユーザーのデータベース キーは複合キーです。これはある程度問題ありませんが、データベースにはいくつかの魔法の文字列があり、より型指定されたバージョンに変換できれば便利です。

プロファイル マップ:

    CompositeId()
    .KeyProperty(x => x.ServiceId, "SERVICE_ID")
    .KeyProperty(x => x.Direction, "DIRECTION").CustomType<DirectionConverter>()
    .KeyReference(x => x.Channel, new string[] { "CHANNEL_ID", "CONTACT_TYPE", "DIRECTION", "SERVICE_ID" })
    .KeyProperty(x => x.ContactType, "CONTACT_TYPE")
    .KeyReference(x => x.Agent, "AGENT_ID");

問題は次の行です。

.KeyReference(x => x.Channel, new string[] { "CHANNEL_ID", "CONTACT_TYPE", "DIRECTION", "SERVICE_ID" })

(したがって、チャネルには複合キーもあります...)

そのリファレンスでは、「DIRECTION」列の処理にコンバーターを使用するように流暢な nhibernate に指示する方法がわかりません。実際には、これは、コンバーターが NullSafeSet で null 値を受け取るためと見なすことができます。

これに対する既存の解​​決策はありますか、またはこの種の列にコンバーターを使用しない唯一のオプションですか?

4

1 に答える 1

1

解決しました。

マッピングが正しくありませんでした。

    CompositeId()
    .KeyProperty(x => x.ServiceId, "SERVICE_ID")
    .KeyProperty(x => x.Direction, "DIRECTION").CustomType<DirectionConverter>()
    .KeyReference(x => x.Channel, new string[] { "CHANNEL_ID", "CONTACT_TYPE", "DIRECTION", "SERVICE_ID" })
    .KeyProperty(x => x.ContactType, "CONTACT_TYPE")
    .KeyReference(x => x.Agent, "AGENT_ID");

正しいバージョン:

CompositeId()
    .KeyReference(x => x.Channel, new string[] { "CHANNEL_ID", "CONTACT_TYPE", "DIRECTION", "SERVICE_ID" })
    .KeyReference(x => x.Agent, "AGENT_ID");

これで、ChannelId、ContactType、Direction、ServiceId、AgentId をこのクラスの複合キーとして使用できるようになりました。不適切なコンバーターはこの問題の症状でしたが、エラー メッセージは非常に誤解を招くものでした。

于 2013-10-02T12:41:31.780 に答える