AFAIK,Fluent NHibernate 中没有“max”这样的东西,但是,如果您将列的允许长度设置为一个真正的大值,它应该可以正常工作。您可以查看 MSDN 以了解 SQL Server 中每种数据类型的最大数字意味着什么,尽管它在其他数据类型中可能意味着一些非常不同的数字。
我使用了反射器,发现了这个:
public MsSql2005Dialect()
{
base.RegisterColumnType(DbType.String, 0x3fffffff, "NVARCHAR(MAX)");
base.RegisterColumnType(DbType.AnsiString, 0x7fffffff, "VARCHAR(MAX)");
base.RegisterColumnType(DbType.Binary, 0x7fffffff, "VARBINARY(MAX)");
}
那么,NHibernate 似乎默认创建最大值?不过,Fluent 没有。(虽然我不知道为什么。)
使用自动映射功能,您可以使用约定来实现它。
例子:
var cfg = new Configuration();
var persistenceModel = new AutoPersistenceModel();
persistenceModel.Conventions.Add(
new PropertyConvention(),
new ReferenceConvention(),
new HasManyConvention(),
ConventionBuilder.Property.Always(delegate(IPropertyInstance instance)
{
if (instance.Property.PropertyType == typeof(string))
instance.Length(16000);
else if (instance.Property.PropertyType == typeof(byte[]))
instance.Length(30000000);
}));
persistenceModel.AddTypeSource(new AssemblyTypeSource(Assembly.GetExecutingAssembly()));
persistenceModel.Where(t => t.Namespace.EndsWith("Entities"));
cfg.AddAutoMappings(persistenceModel);
return cfg.BuildSessionFactory();
对我来说,这就足够了,但你总是可以使用更大的数字。
如果您不使用自动映射,我猜 Dan Fitch 的解决方案是可行的方法。