我正在使用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]属性,我需要导入哪些命名空间或类?
答案 0 :(得分:6)
虽然底部的答案是正确的,但它们并不完整。
要避免4000字符限制,必须在DB和NHibernate上处理它。
对于数据库,您只需要将列定义为无限制 最初做了。确保列为nvarchar(max)或 DB中的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)
);
在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; }
}
答案 1 :(得分:2)
此错误来自SQL Server。如果您希望字符串更长,则需要修改SQL模式以使用VARCHAR(MAX)
之类的内容。
答案 2 :(得分:1)
这是一个数据库问题。
对于SQL Server 2008及更高版本,请使用VARCHAR(MAX)
。
对于SQL Server 2005及更早版本,您需要显式声明varchar大小,例如VARCHAR(5000)
,其中VARCHAR(8000)
为限制。
答案 3 :(得分:0)
解决此问题的另一种方法是像这样配置地图:
Map(l => l.Description ).CustomType("StringClob").CustomSqlType("varchar(max)");