4

我正在尝试创建我的第一个 NHibernate 项目,所以我可能在这里做了一些愚蠢的事情,但是已经在谷歌上搜索了几天,还没有任何快乐。

我有一个具有各种属性的 Article 对象:

public class Article {
    public virtual string Title { get; set; }
    public virtual string Body { get; set; }
}

我正在使用流利的配置来加载映射:

configuration.Mappings(m => m.AutoMappings.Add((AutoMap.AssemblyOf<Article>())
                            .Conventions.Add(DefaultCascade.All())
                            .UseOverridesFromAssemblyOf<SchemaConfigurationController>())

覆盖是:

public class ArticleOverrideMapping : IAutoMappingOverride<Article>
{
    public void Override(AutoMapping<Article> mapping)
    {
       //mapping.Map(x => x.Body).CustomSqlType("NVARCHAR(4000)");
       //mapping.Map(article => article.Body).Length(10000);
       //mapping.Map(article => article.Body).Length(Int32.MaxValue);            
       //mapping.Map(article => article.Body).CustomSqlType("NVARCHAR(max)");           
       //mapping.Map(article => article.Body).CustomSqlType("NVARCHAR(max)").Length(Int32.MaxValue);           
       mapping.Map(article => article.Body).CustomType("StringClob").CustomSqlType("NVARCHAR(max)");
    }
}

我已经尝试了每条注释掉的行(大致按照我在网上找到可能的解决方案的顺序)。我可以让 SQL Server 创建 nvarchar(max) 列,如果我使用 SQL 管理工作室,我可以将很多(185,602 个单词是最大的测试)粘贴到 Body 列中。我的问题是尝试使用 NHibernate 从 MVC 站点保存它。

我得到两个主要错误:

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

如果我没有设置“.Length(Int32.MaxValue)”覆盖,就会发生这种情况。

发生的第二个错误(设置长度时):

The length of the string value exceeds the length configured in the mapping/parameter.

我很困惑此时我应该做什么。我的目标是能够在 SQL Server 中存储一个非常大的字符串(整篇文章)(以及用于测试的 SQLite,SQLite 不喜欢 nvarchar(max))并将其取出,(并对其进行编辑) MVC 网站。

更新

根据@Cymen的链接,我试过了

.CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable();

但这会导致错误:

The length of the string value exceeds the length configured in the mapping/parameter. 

当我只尝试保存 1201 个单词时(所有单词“test”)。当我在上述映射“.Length(Int32.MaxValue)”的末尾添加长度时,我仍然是同样的错误。

更新

想确认我使用的是哪些版本:

 FluentNHibernate.1.3.0.733
 NHibernate.3.3.1.4000
 Microsoft.AspNet.Mvc.4.0.20710.0

最终更新

Kieren 说得对,我完全忘记了我获取了该属性并在服务器上对其运行了 markdownsharp 并在服务器上填充了第二个属性。所以这是我没有映射的第二个属性实际上正在爆炸,抱歉。

4

2 回答 2

1

好的,伙计们。同样的东西,所以我做了一些测试。

似乎 int.MaxValue 不能用作流利的 LENGTH。如果这样做,生成的创建 SQL 将是 nvarchar(255)。因此,如果 nhibernate(流利的)仍然生成这样的脚本,那么他最多等待 255 个字符。

如果您仍然使用 int.MaxValue / 2,那么一切正常。至少在剧本中。 唯一合理的解释:unicode 字符串,因此对于单个 char fluent 自动占用 2 个字节。所以内部流利的休眠可能会乘以2。如果我们得到超过2GB的空间,谁知道流利的会做什么......

请让我知道它是否也适用于数据。

于 2014-03-23T17:09:25.563 回答
1

这就是我通常的处理方式。

mapping.Map(x => x.Problem).CustomType("varchar(MAX)");

不确定 CustomSqlType 是什么,但我从来没有使用过它,这很有效。

于 2012-11-14T23:54:31.340 回答