2009-07-08 72 views
14

如何獲得流利的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; } 
} 

去過事先未能在現在發現好幾個小時的解決方案,所以感謝

捷克克朗

回答

10

我不知道爲什麼你的ActiveRecord的例子不工作,但你可以嘗試設置列的長度。

用流利的NHibernate的,你應該能夠做到

Map(x => x.FileData) 
    .WithLengthOf(2147483647) 
0

首先,我(煩人)把地圖文件到核心項目,而不是數據項目。

我仍然無法得到它的一個映射文件的工作,但我寫了一個XML文件,而不是,寫在文件長度 - 感謝丹

<property name="FileName"/> 
<property name="FileType"/> 
<property name="VersionNo"/> 
<property name="FileLength"/> 
<property name="FileData" length="2147483647"/> 
1

據我所知,沒有這樣的事在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(); 

對於我來說,這足夠了,但你總是可以使用更大的數字。

如果你不使用自動映射,我猜,丹菲奇的解決方案是走的路。

1

在映射使用:

Map(x => x.FileData).CustomSqlType("VARBINARY(MAX)");

4

我在和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

2

你需要一個自動映射覆蓋:

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(); 
} 
相關問題