如何在使用字段大小为varbinary(max)的sql server 2005表中创建一个varbinary字段,以获得流畅的nhibernate?目前我总是得到一个varbinary(8000)的默认值,这个值不够大,因为我将要存储图像文件。
我尝试过使用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; }
}
现在未能找到解决方案数小时,所以提前谢谢
捷克克朗
答案 0 :(得分:10)
我不确定为什么你的ActiveRecord示例不起作用,但你可以尝试设置列的长度。
使用Fluent NHibernate,您应该可以
Map(x => x.FileData)
.WithLengthOf(2147483647)
答案 1 :(得分:5)
我遇到了与SQL FileStream和Fluent NHibernate类似的问题,我的BLOB写入在8000字节处被截断。以下语法最终修复了问题:
Map(x => x.Bytes)
.CustomSqlType("VARBINARY (MAX) FILESTREAM")
.Length(2147483647)
.Not.Nullable();
答案 2 :(得分:2)
在地图使用中:
Map(x => x.FileData).CustomSqlType("VARBINARY(MAX)");
答案 3 :(得分:2)
您需要自动映射覆盖:
public class MyFileMapOverride : IAutoMappingOverride<MyFile>
{
public void Override( AutoMapping<MyFile> mapping )
{
mapping.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();
}
答案 4 :(得分:1)
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默认创建了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 Dan的解决方案是可行的。
答案 5 :(得分:0)
首先,我(恼人地)将地图文件放入核心项目而不是数据项目。
我仍然无法使用地图文件,但我写了一个xml文件,编写文件长度 - 感谢那个Dan
<property name="FileName"/>
<property name="FileType"/>
<property name="VersionNo"/>
<property name="FileLength"/>
<property name="FileData" length="2147483647"/>