2009-07-08 13 views
14

varbinary(max)のフィールドサイズを使用するSQL Server 2005テーブルで、流暢なnhibernateを使ってvarbinaryフィールドを作成するにはどうすればよいですか?現時点では、私はいつもデフォルトのvarbinary(8000)を取得していますが、これはイメージファイルを格納するためには十分ではありません。sqlサーバでvarbinary(max)フィールドを作成するには流暢なnhibernateを取得するには

私は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; } 
} 

CZK事前にので、今時間の解を求めることに感謝を失敗し、あなたのActiveRecordの例が機能しない理由

答えて

10

私はわからないんだけど、そこにあなたが設定してみてください可能性がある者列の長さ。

流暢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"と指定した場合、カラムの許容長を実際の大きな値に設定した場合、正常に動作するはずです。 SQL Serverの各データ型で最大数が何を意味するのかをMSDNで確認できますが、他の数では非常に異なる数を意味する可能性があります。私は反射板を使用して、この見つかっ

:だから

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

、これで十分、しかし、あなたはいつもより多くを使用することができます。

オートフィッシングを使用しないと、Dan Fitchの解決策があります。マッピングの使用で

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)'のように、 –

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(); 
} 
関連する問題