1

私は使っている

GeneratedBy.HiLo(string table, string column, string maxLo, string where);

主キー用。現在、コードに定数として格納するのではなく、テーブルから maxLo をロードする方法を探しています。NextHi の値はデータベース テーブルから読み込まれます (そうでなければ、概念全体がまったく機能しません)。しかし、テーブルから maxLo をロードする方法も見つかりませんでした。簡単なコード調査から、それは不可能のように見えますが、それでも何かが欠けている可能性があります。

必要な理由: ビジネス アプリケーションと別の構成アプリケーションがあり、テーブルに何かを挿入する場合、ID の一貫性のために同じ maxLo を使用する必要があります。もちろん、アプリケーションは排他的に実行できます。考えられる 2 つの回避策: - maxLo が保存される共有 Dll をいくつか持つことができます - データベース内のテーブルを使用して、自分で maxLo をロードすることができます

それでも、回避策なしでやりたいことをしても問題ありません。

FluentNHibernate バージョン: 2.0.1.0

4

1 に答える 1

0

答えを知りたいのですが、私答えはノーです。この値を設定として渡す必要があります。その理由は、テーブル hi-lo ジェネレーターの実装方法にあります。

TableHiLoGenerator コード .Configure() を確認してください

/// <summary>
/// Configures the TableHiLoGenerator by reading the value of <c>table</c>, 
/// <c>column</c>, <c>max_lo</c>, and <c>schema</c> from the <c>parms</c> parameter.
/// </summary>
/// <param name="type">The <see cref="IType"/> the identifier should be.</param>
/// <param name="parms">An <see cref="IDictionary"/> of Param values that are keyed by parameter name.</param>
/// <param name="dialect">The <see cref="Dialect.Dialect"/> to help with Configuration.</param>
public override void Configure(IType type, IDictionary<string, string> parms, Dialect.Dialect dialect)
{
    base.Configure(type, parms, dialect);
    maxLo = PropertiesHelper.GetInt64(MaxLo, parms, Int16.MaxValue);
    lo = maxLo + 1; // so we "clock over" on the first invocation
    returnClass = type.ReturnedClass;
}

最も興味深い部分はコメントです:

//Configures the TableHiLoGenerator by reading the value of <c>table</c>, 
// <c>column</c>, <c>max_lo</c>, and <c>schema</c> from the <c>parms</c> parameter.

そしてパラメータIDictionary<string, string> parms

極端な場合、これ(およびその流暢なバージョン: GeneratedBy.HiLo(...))を使用して、どこか(ADO.NET など)からプロパティを読み取り、そのような値を構成に渡すことができます...これは本当に極端ですが答えになる可能性があります。

于 2015-06-03T05:46:24.030 に答える