如何获得流利的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(); 
+0

`int.MaxValue`可能是更好的表达幻数的方式。如在`.Length(int.MaxValue)`中 – 2016-03-02 10:17:43

你需要一个自动映射覆盖:

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(); 
}