使用nvarchar(max)自动映射字符串列表

本文关键字:映射 字符串 列表 nvarchar max 使用 | 更新日期: 2023-09-27 18:11:21

我使用Fluent NHibernate 1.2为NHibernate 3.1。我有一个类:

public class Marks
{
    public virtual int Id { get; set; }
    public virtual IList<string> Answers { get; set; }
}
在Marks类的映射中,我有:
HasMany(m => m.Answers).Element("Value");

创建表时,将创建一个包含以下列的"Answers"表:

Marks_id (FK, int, not null)
Value (nvarchar(255), null)

我想做的是让值为nvarchar(max)。我不希望对每个类中的每个字符串都这样做,只针对这一个类。

我已经看了这些帖子:第一,第二,第三,但还没有发现任何有帮助的。

提前感谢你能提供的任何帮助。如果您需要更多的信息,请告诉我。

编辑:

下面是解决这个问题的代码:

HasMany(x => x.Answers).Element("Value", x => x.Columns.Single().Length = 4001);

使用nvarchar(max)自动映射字符串列表

您可以通过使用CustomSqlType("nvarchar(max)")来强制将string映射到映射中的每个列级别上的更长的列,或者更普遍的是,通过设置Length(4001) (SQL Server幻数,超过它将自动创建nvarchar(max))。

要自动应用于实体中的所有string列,您可以编写自己的FluentNHibernate约定:

public class LongStringConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof(string));
    }
    public void Apply(IPropertyInstance instance)
    {
        instance.Length(4001);
    }
}

并在映射容器中注册,比如:

Fluently.Configure()
    .Mappings(...)
    .Conventions.Add<LongStringConvention>()

要将其应用于字符串集合,可以使用自定义元素映射:

HasMany(x => x.Answers).Element("Value", x => x.Columns.Single().Length = 4001);

我自己也遇到过这个问题,上面的答案对我指明正确的方向很有帮助。但我使用的是稍微更新的FluentNH版本。

对于Fluent NHibernate 1.3和NH 3.3.1,正确的代码是:

HasMany(x => x.Answers).Element("Value", x => x.Length(4001));

上面的答案只适用于旧版本的nhibernate。如果您尝试HasMany(x => x.Answers).Element("Value", x => x.Length(4001));,您将得到以下内容:

错误属性或索引器"FluentNHibernate.MappingModel.ColumnMapping。长度不能为赋值给——它是只读

正确的方法是(NHibernate 4.0.2.4, FluentNHibernate 2.0.1.0):
HasMany(m => m.Answers).Element("Value", e => e.Length(4001))