我正在尝试将一些非常长的文本插入到字符串prop中 - 它与LinqToSql完美配合,现在我已切换到NHibernate并希望保存相同的实体,但nHibernate会抛出上述异常。
我该如何解决这个问题?
最初我的道具被定义为:
Map(x => x.Content, "fT_Content").Nullable();
Map(x => x.Fields, "fT_Fields").Nullable();
现在它们是:这是有效的,但为什么我必须这样做?
Map(x => x.Content, "fT_Content").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable();
Map(x => x.Fields, "fT_Fields").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable();
注意:我使用nuget有最新的nhibernate。
对于ref,这里是字段:
public virtual string Content
{
get;
set;
}
public virtual string Fields
{
get;
set;
}
我想避免进入现场制作,突然插入就停止在这张桌子上工作....
答案 0 :(得分:71)
这是NHibernate处理nvarchar(max)的众所周知的问题,请参阅:
多年来,我一直在将nvarchar(max)列映射到StringClob而不会遇到任何问题:
<property name="myProp" column="MY_PROP" not-null="true" type="StringClob" access="property"></property>
此链接(来自评论)描述了解决此问题所需的流畅映射:
http://www.tritac.com/bp-21-fluent-nhibernate-nvarcharmax-fields-truncated-to-4000-characters
Map(x => x.Description).CustomType("StringClob").CustomSqlType("nvarchar(max)");
答案 1 :(得分:9)
NHibernate中的默认最大字符串长度为4000个字符。
答案 2 :(得分:8)
如果你使用nHibernate Mapping By Code(非流利),我在这里找到了解决方案:
https://groups.google.com/forum/#!topic/nhusers/uDAcP4BqFUU
Property(x => x.Description, c =>
{
c.Column("Product");
c.Type(NHibernateUtil.StringClob);
}
);
答案 3 :(得分:1)
这是一个相当古老的问题,现在似乎有一个更直接的解决方案。我有同样的问题,并在映射中将列的长度设置为Int32.MaxValue解决了问题:
Map(_ => _.Body).Length(Int32.MaxValue);
答案 4 :(得分:0)
我遇到了类似的问题,但使用了CustomType
(源自IUserType
)。事实证明,与没有自定义类型相比,它更容易修复。您需要做的就是定义SqlTypes以显式返回您想要的更长的字符串长度类型。
public SqlType[] SqlTypes
{
get
{
// Explicitly specify the string max length
return new SqlType[] { SqlTypeFactory.GetString(Int32.MaxValue / 2) };
}
}
这很好地解决了我们的问题。