1

カスタムOrchardモジュールで新しいテーブルのデータ移行を作成しました。このテーブルは、アップロードされたファイルデータを列の1つに保存する必要があります。問題の列の移行コードは次のとおりです(簡潔にするために他の列は削除されています)。

SchemaBuilder.CreateTable("Attachment", table => table
    .Column<byte[]>("Content", col => col.WithLength(2147483647).WithType(DbType.Binary).Unlimited())
);

WithLengthメソッドとUnlimitedメソッドの両方を追加/削除しようとしましたが、どちらもエラーの発生を停止しません。NHibernateの例外は次のとおりです。

The length of the byte[] value exceeds the length configured in the mapping/parameter.
  at NHibernate.Type.AbstractBinaryType.Set(IDbCommand cmd, Object value, Int32 index)
  at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index)
  at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)

編集:私はバイナリ長の規則を追加するなどのことで遊んでいます(ここを参照してください:NHibernate Image Storage-byte []値の長さが構成された長さを超えています)、これも役に立ちませんでしたが、まるでDbType.Binaryには8000バイトの制限があります。これは、私が到達している上限です。MSDNドキュメントから:DbType.Binary-1〜8,000バイトの範囲のバイナリデータの可変長ストリーム。答えは、この制限の影響を受けないSqlDbType.Imageを使用することですが、OrchardSchemaBuilderでは使用できません。

編集2:追加するのを忘れました-添付ファイルテーブルに保存されているドメインオブジェクトを呼び出すIRepository<T>.Create()か、作成または更新するとエラーが発生します。IRepository<T>.Update()

SchemaBuilderをオーバーライド/拡張​​して、SqlDbType.Imageを列タイプとして使用できるようにする方法はありますか?Orchard1.6を使用しています

4

1 に答える 1

0

したがって、この問題は、OrchardがSQLServerとSQLCompactの両方をサポートする必要があり、VARBINARY(MAX)がCompactEditionでサポートされていないことに起因しているように見えます。私が見ることができる唯一の前進の方法は、すでにOrchardにあるものの上に独自のスキーマビルダーを作成することです。私が採用するアプローチは、カスタムのCreateColumnCommandとカスタムのDataMigrationInterpreter(および関連するその他の必要なもの)を作成して、スキーマの生成を実行することです。動作したら、関連するコードを投稿します。このアプローチに欠陥があると誰かが思ったら、叫んでください!

編集:ただし、詳しく調べると、イメージタイプはSQL Server CEでサポートされているため、Orchardでこれが不可能な理由についてはまだ迷っています。代替案がない場合でも、私のカスタムソリューションを検討し続けます。

于 2013-01-08T10:45:00.370 に答える