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 个字符?

更新:

除了数据库方面,我读到您还必须在 NHibernate 方面处理它,以确保它不会截断字符串。人们告诉我添加属性:

[StringLengthMax]

但是,我的模型只识别 [StringLength] 属性。为了使用 [StringLengthMax] 属性,我需要导入什么命名空间或类?

4

4 回答 4

6

虽然底部的答案是正确的,但它们并不完整。

为了避免 4000 个字符的限制,必须在 DB 和 NHibernate 上都处理它。

  1. 对于数据库,您只需像我最初所做的那样将列定义为无限制。确保该列是数据库中的 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 回答
2

此错误来自 SQL Server。如果您希望字符串更长,则需要修改 SQL 模式以使用类似VARCHAR(MAX).

于 2013-08-19T13:26:39.117 回答
1

这是一个数据库问题。

对于 SQL Server 2008 及更高版本,请使用VARCHAR(MAX).

对于 SQL Server 2005 及更早版本,您需要明确声明 varchar 大小,例如VARCHAR(5000)VARCHAR(8000)作为限制。

于 2013-08-19T13:29:58.613 回答
0

解决此问题的另一种方法是像这样配置 Map:

Map(l => l.Description ).CustomType("StringClob").CustomSqlType("varchar(max)");
于 2019-03-13T12:46:26.510 回答