3

Orchard 1.6 を使用しており、モジュールのパーツを作成しています。特定のテーブルを作成する移行ファイルの一部は次のとおりです。

    // Creating table SessionInformationRecord
    SchemaBuilder.CreateTable("SessionInformationRecord", table => table
        .Column("Id", DbType.Int32, column => column.PrimaryKey().Identity())
        .Column("TrackInformationRecord_Id", DbType.Int32)
        .Column("Title", DbType.String, col => col.Unlimited())
        .Column("Description", DbType.String, col => col.Unlimited())
        .Column("StartDate", DbType.DateTime)
        .Column("EndDate", DbType.DateTime)
        .Column("HasEvaluation", DbType.Boolean)
        .Column("IsDeleted", DbType.Boolean)
    );

タイトルと説明は、無制限の文字列である必要があります。ただし、これらのフィールドに 4000 文字を超えるコンテンツを入力すると、次のエラーが発生します。

{"@p1 : String truncation: max=4000, len=21588, value=''."}

これを回避する他の方法はありますか?または、文字列の最大文字数は 4000 文字ですか?

アップデート:

DB側とは別に、文字列が切り捨てられないようにNHibernate側でも処理する必要があることを読みました。属性を追加するように言われました:

[StringLengthMax]

ただし、私のモデルは [StringLength] 属性しか認識しません。[StringLengthMax] 属性を使用するには、どの名前空間またはクラスをインポートする必要がありますか?

4

4 に答える 4

6

一番下の答えは正しいですが、完全ではありません。

4000 文字の制限を回避するには、DB と NHibernate の両方で処理する必要があります。

  1. DB の場合、最初に行ったように列を無制限に定義するだけです。DB で列が nvarchar(max) または varchar(max) であることを確認します。

    // Creating table KeynoteInformationRecord
    SchemaBuilder.CreateTable("KeynoteInformationRecord", table => table
        .Column("Id", DbType.Int32, column => column.PrimaryKey().Identity())
        .Column("KeynotePartId", DbType.Int32)
        .Column("Title", DbType.String, column => column.Unlimited())
        .Column("Description", DbType.String, column => column.Unlimited())
        .Column("StartDate", DbType.DateTime)
        .Column("EndDate", DbType.DateTime)
        .Column("HasEvaluation", DbType.Boolean)
        .Column("IsDeleted", DbType.Boolean)
    );
    
  2. Nhibernate 側では、文字列が切り捨てられないようにするために、モデル クラス内の文字列プロパティに [StringLengthMax] 属性を追加する必要があります。Orchard では、プロパティを使用するために Orchard.Data.Conventions を含める必要があります。

下記参照:

public class KeynoteInformationRecord
{
    public virtual int Id { get; set; }
    public virtual int KeynotePartId { get; set; }
    [StringLengthMax]
    public virtual string Title { get; set; }
    [StringLengthMax]
    public virtual string Description { get; set; }
    public virtual DateTime StartDate { get; set; }
    public virtual DateTime EndDate { get; set; }
    public virtual bool HasEvaluation { get; set; }
    public virtual bool IsDeleted { get; set; }
}
于 2013-08-20T16:55:17.787 に答える
1

これはデータベースの問題です。

SQL Server 2008 以降の場合は、VARCHAR(MAX).

SQL Server 2005 以前の場合、varchar のサイズを明示的に指定する必要があります。たとえばVARCHAR(5000)VARCHAR(8000)制限があります。

于 2013-08-19T13:29:58.613 に答える