1

私には2つのエンティティタイプがあります:

  • RunContainerの親エンティティタイプ
  • 子エンティティタイプを実行する

Runには、次のようにRunStatusタイプのプロパティStatusがあります。

public enum RunStatus
{
  Created,
  Starting,
  // ...
}
public class Run
{
  public int ContainerId { get; private set; }
  // ...
  public RunStatus Status { get; private set; }
}

RunContainerには、次のように計算されたプロパティActiveRunCountがあります。

public class RunContainer
{
  public int Id { get; private set; }
  // ...
  public int ActiveRunCount { get; private set; }
}

プロパティのマッピングでは、RunContainer.ActiveRunCount次のような式の指定を使用します。

<property name="ActiveRunCount" formula="(select count(r.Id) from Run r where r.ContainerId = Id and r.Status = 1)"/>

私の問題は、数式内のRunStatus列挙値を、適切な記号名ではなく、それぞれの数値で参照していることです。代わりに記号名を使用する方法を教えてもらえますか?

ありがとう。

4

1 に答える 1

1

SQL列が文字列型の場合、NHibernateは列挙型を文字列表現にマップします。これは、NHibernateにスキーマを生成させる場合のデフォルトです。

それで:

ALTER TABLE Run ALTER COLUMN Status varchar(20)

とマッピングで

<class name="Run">
  <!- [...] -->
  <property name="Status"/>
</class>

これで、SQLテーブルに列挙型の文字列表現が含まれるようになります。これで、数式でクエリを実行できます。

<property name="ActiveRunCount" formula="
  (select count(r.Id) from Run r 
  where r.ContainerId=Id and r.Status='Active')"/>

(テーブルにすでにデータがある場合は、裸のALTER COLUMNステートメントの代わりに変換を記述する必要があります)。


コメント後に編集:

マッピングファイルを生成し、数式に列挙値が正しいことを確認するには、FluentNhibernateを使用できます。ActiveRunプロパティのマッピングは次のようになります。

Map(x => x.ActiveRunCount)
 .Formula(string.Format("(select count(r.Id) [...] and r.Status='{0}')",
   RunStatus.Active))

それがあなたが探していたものである場合は、列に整数を保持してこれを行うこともできます:

Map(x => x.ActiveRunCount)
 .Formula(string.Format("(select count(r.Id) [...] and r.Status={0})",
   (int)RunStatus.Active))
于 2010-04-06T21:56:40.350 に答える