4

次のマッピングがあります。ここでは、いくつかの文字列フィールドの長さを指定します。

public ResolutionMap()
{
  Schema("dbo");
  Table("Resolution");
  Id(x => x.IdResolution, "resolution_id").UnsavedValue(0).GeneratedBy.Identity();
  Component(x => x.Store, m =>
    {
      m.Map(y => y.StoreCodeId, "store_code_id");
      m.Map(y => y.StoreCode, "store_code").Length(10);
    }
  );
  Map(x => x.ResolutionData, "resolution_data").Length(42);
}

ただし、SQL Serverプロファイラーで実行される更新クエリを見ると、マッピングで設定された長さがパラメーター宣言でまったく尊重されていないことがわかります。

exec sp_executesql
  N'UPDATE dbo.Resolution SET resolution_data = @p0, store_code_id = @p1, store_code = @p2 WHERE resolution_id = @p3',
  N'@p0 nvarchar(4000),@p1 int,@p2 nvarchar(4000),@p3 int',
  @p0=N'Test',@p1=89,@p2=N'ST000003',@p3=275

なぜこれが起こっているのでしょうか?更新プロセスが遅くなるため、長さを設定する必要があります。

現在、FluentNHibernate1.3.0.733とNHibernate3.3.1over .NETFramework3.5を使用しています。

4

1 に答える 1

4

どうやら、Length(x)マッピングからデータベーススキーマを生成している場合にのみ使用されます。

NHibernateでは、切り捨てが含まれる列にプロパティを保存できません。例外が発生します。

"String or binary data would be truncated. The statement has been terminated."

文字列の基になるタイプは何ですか?文字列は常に同じ長さですか、それとも異なりますか?varchar(x)例えば。

たとえば、次のように長さを指定できます。

Map(x => x.StoreCode).CustomSqlType("varchar (512)");

または、デフォルトの文字列長を設定するための規則を作成できます。

public class DefaultStringLengthConvention: IPropertyConvention
{
  public void Apply(IPropertyInstance instance)
  {
    instance.Length(250);
  }
}

詳細については、以下を参照してください。

長いテキスト文字列の流暢なNHibernateのオーバーライドnvarchar(255)ではなくnvarchar(MAX)

http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/ --StringColumnLengthConvention

https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping

https://github.com/jagregory/fluent-nhibernate/wiki/Conventions

于 2012-10-09T19:37:44.220 に答える