如何获得流利的nhibernate在sql server中创建varbinary(max)字段
如何获得流利的nhibernate在使用varbinary(max)字段大小的sql server 2005表中创建varbinary字段?目前,我总是得到varbinary(8000)的默认值,这个值不够大,因为我将要存储图像文件。如何获得流利的nhibernate在sql server中创建varbinary(max)字段
我试过使用CAstle.ActiveRecord,但还没有任何成功。
[ActiveRecord]
public class MyFile : Entity
{
public virtual string FileName { get; set; }
public virtual string FileType { get; set; }
public virtual int FileVersion { get; set; }
public virtual int FileLength { get; set; }
[Property(ColumnType = "BinaryBlob", SqlType = "VARBINARY(MAX)")]
public virtual byte[] FileData { get; set; }
}
去过事先未能在现在发现好几个小时的解决方案,所以感谢
捷克克朗
我不知道为什么你的ActiveRecord的例子不工作,但你可以尝试设置列的长度。
用流利的NHibernate的,你应该能够做到
Map(x => x.FileData)
.WithLengthOf(2147483647)
首先,我(烦人)把地图文件到核心项目,而不是数据项目。
我仍然无法得到它的一个映射文件的工作,但我写了一个XML文件,而不是,写在文件长度 - 感谢丹
<property name="FileName"/>
<property name="FileType"/>
<property name="VersionNo"/>
<property name="FileLength"/>
<property name="FileData" length="2147483647"/>
据我所知,没有这样的事在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的默认创建最多?不过,流利没有。 (尽管我不知道为什么。)
使用自动映射功能,您可以使用约定来实现它。
例子:
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();
对于我来说,这足够了,但你总是可以使用更大的数字。
如果你不使用自动映射,我猜,丹菲奇的解决方案是走的路。
在映射使用:
Map(x => x.FileData).CustomSqlType("VARBINARY(MAX)");
我在和SQL的FileStream和在我的BLOB写在了8000个字节截断功能NHibernate类似的问题。以下语法终于解决了这一问题:
Map(x => x.Bytes)
.CustomSqlType("VARBINARY (MAX) FILESTREAM")
.Length(2147483647)
.Not.Nullable();
你需要一个自动映射覆盖:
public class MyFileMapOverride : IAutoMappingOverride<MyFile>
{
public void Override(AutoMapping<MyFile> mapping)
{
mapping.Map(x => x.FileData).Length(int.MaxValue);
}
}
由于您使用的城堡,你可以告诉它要连接NHibernate的与您的映射你的NHibernateInstaller:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<ISessionFactory>()
.UsingFactoryMethod(k => BuildSessionFactory())
.Named("MySessionFactory"));
// Do other stuff...
}
private ISessionFactory BuildSessionFactory()
{
var mappings = AutoMap.AssemblyOf<MyFile>()
.IgnoreBase(typeof(Entity))
.UseOverridesFromAssemblyOf<MyFileMapOverride>();
var configuration = ConfigurationUtility
.CreateConfiguration<WebSessionContext, DefaultProxyFactoryFactory>(
"MyDbConnection",
ConfigurationUtility.ForMsSql,
mappings,
NHibernateConfiguration.GetConfigurationPath());
return configuration.BuildSessionFactory();
}
`int.MaxValue`可能是更好的表达幻数的方式。如在`.Length(int.MaxValue)`中 – 2016-03-02 10:17:43