使用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);
您可以通过使用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));
,您将得到以下内容:
正确的方法是(NHibernate 4.0.2.4, FluentNHibernate 2.0.1.0):错误属性或索引器"FluentNHibernate.MappingModel.ColumnMapping。长度不能为赋值给——它是只读
HasMany(m => m.Answers).Element("Value", e => e.Length(4001))