4

Fluent NHibernate を使用しており、クラスを自動マッピングしています。

次の行に沿って、クラスに計算されたプロパティがあります

public virtual DateTime? LastActionTimeStamp
{
    get {
        return Actions.Count == 0 ? null : Actions.OrderByDescending(
            a => a.TimeStamp).ElementAt(0).TimeStamp;
    }
}

これは残りのプロパティにマップされていないため、ICriteria 制限では使用できませんでした。私は空のセッターを追加しました(どこかで読んだように、そうするとマッピングに含まれますが、そうです)、NHibernateエラーが発生しています:

クエリを実行できませんでした...列名 'LastActionTimeStamp' が無効です。

したがって、私の質問は次のとおりです。Fluent NHibernate に、このプロパティのデータベースを無視するように NHibernate に指示するにはどうすればよいですか?

4

3 に答える 3

2

数式をプロパティに関連付けて、C# コードの代わりに使用できます。例えば

財産:

private int _postCount = 0;
public virtual int PostCount
{
    get
    {
        return _postCount;
    }
}

方式:

(SELECT count(p.ID) FROM BlogPost p WHERE p.BlogID = ID and p.IsDeleted = 0)

その後、通常どおり式で PostCount を使用できます。FluentMapping のプロパティにアクセス修飾子を設定することを忘れないでください。Fluent が何をサポートしているかはわかりませんが、通常のマッピングで見つけたオプションは次のとおりです。

* property
* field
* field.camelcase
* field.camelcase-underscore
* field.pascalcase-m-underscore
* field.lowercase-underscore
* nosetter.camelcase
* nosetter.camelcase-underscore
* nosetter.pascalcase-m-underscore
* nosetter.lowercase-underscore

アクセス戦略の公式リストについては、NHibernate のドキュメントを参照してください。これにより、アクセス戦略と名前付け戦略 (「field.lowercase-underscore」など) を組み合わせることができます。

于 2010-03-05T14:36:32.920 に答える
1

マッピングをオーバーライドして、プロパティを無視することもできます。

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass>
{
  public void Override(AutoMapping<ThatClass> mapping)
        {
            mapping.IgnoreProperty(x=> x.PropertyToIgnore);
        }
}
于 2011-01-18T13:32:42.433 に答える
1

NHibernate でそれができるかどうかはわかりませんが、間違っている可能性があります。NHibernate は基準を SQL に変換するため、そのプロパティを使用してクエリを実行することはできません (データベースにはありません!)。

ただし、私が間違っている場合 (それはよくあることです)、オーバーライドでマップできるはずです。

自動マッピングのセットアップで、オーバーライドを作成し、プロパティを使用してそのプロパティを明示的にマップして、AccessNHibernate にその処理方法を伝えます。

このようなもの:

AutoMap.AssemblyOf<YourEntity>()
  // automapping stuff
  .Override<ThatClass>(m =>
  {
    m.Map(x => x.LastActionTimeStamp)
      .Access.None();
  });
于 2010-03-05T13:35:41.703 に答える