如何让fluent nhibernate在sql server中创建varbinary(max)字段
如何让fluent nhibernate在使用varbinary(max)字段大小的sql server 2005表中创建varbinary字段?目前,我总是得到一个默认值varbinary(8000),它不够大,因为我要存储图像文件 我试过使用CAstle.ActiveRecord,但还没有成功如何让fluent nhibernate在sql server中创建varbinary(max)字段,nhibernate,fluent-nhibernate,nhibernate-mapping,varbinary,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Varbinary,如何让fluent nhibernate在使用varbinary(max)字段大小的sql server 2005表中创建varbinary字段?目前,我总是得到一个默认值varbinary(8000),它不够大,因为我要存储图像文件 我试过使用CAstle.ActiveRecord,但还没有成功 [ActiveRecord] public class MyFile : Entity { public virtual string FileName { get; set; }
[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; }
}
几个小时以来一直未能找到解决方案,因此,请提前感谢
czk我不确定为什么ActiveRecord示例不起作用,但是您可以尝试设置列的长度 使用流利的NHibernate,您应该能够
Map(x => x.FileData)
.WithLengthOf(2147483647)
首先,我(恼人地)将地图文件放在核心项目中,而不是数据项目中
我仍然无法让它与地图文件一起工作,但我编写了一个xml文件,将文件长度写为-谢谢Dan
<property name="FileName"/>
<property name="FileType"/>
<property name="VersionNo"/>
<property name="FileLength"/>
<property name="FileData" length="2147483647"/>
好的,Fluent NHibernate中没有“max”这样的东西,但是,如果您将允许的列长度设置为一个真正的大值,它应该可以正常工作。您可以检查MSDN,了解number max对于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默认创建了max?不过,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的解决方案是一条可行之路。在映射中使用:
Map(x=>x.FileData).CustomSqlType(“VARBINARY(MAX)”代码>我在SQL FileStream和Fluent NHibernate中遇到了类似的问题,我的BLOB写入被截断为8000字节。以下语法最终解决了该问题:
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 );
}
}
公共类MyFileMapOverride:IAutoMappingOverride
{
公共无效替代(自动映射)
{
Map(x=>x.FileData).Length(int.MaxValue);
}
}
由于您使用的是Castle,您可以告诉它将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();
}
public void安装(IWindsorContainer,IConfigurationStore)
{
container.Register(Component.For())
.UsingFactoryMethod(k=>BuildSessionFactory())
。名为(“MySessionFactory”);
//做其他事情。。。
}
私有ISessionFactory BuildSessionFactory()
{
var mappings=AutoMap.AssemblyOf()
.IgnoreBase(类型(实体))
.UseOverridesFromAssemblyOf();
var configuration=ConfigurationUtility
.CreateConfiguration(
“MyDbConnection”,
ConfigurationUtility.ForMsSql,
映射,
NHibernateConfiguration.GetConfigurationPath());
返回configuration.BuildSessionFactory();
}
int.MaxValue
可能是一种更好的表示幻数的方法。与使用NHibernate版本3.1.0.4000和FluentNhibernate版本1.2.0.712时的.Length(int.MaxValue)
一样,这不起作用。这对我很有用:Map(x=>x.FileData).CustomType(“BinaryBlob”)
。