1

我在自定义 Orchard 模块中为新表创建了数据迁移。该表需要将上传的文件数据存储在其中一列中。这是相关列的迁移代码(为简洁起见,删除了其他列):

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 - The length of the byte[] value超出了配置的长度),这也没有帮助,但看起来好像DbType.Binary 有 8000 字节的限制,这是我要达到的上限。来自MSDN 文档:DbType.Binary - 可变长度的二进制数据流,范围在 1 到 8,000 字节之间。答案是使用不受此限制的 SqlDbType.Image,但 Orchard Schema Builder 无法使用它。

编辑 2:我忘了添加 - 当我调用IRepository<T>.Create()IRepository<T>.Update()创建或更新存储在附件表中的域对象时发生错误。

有没有办法覆盖/扩展 SchemaBuilder 以便我可以使用 SqlDbType.Image 作为列类型?我正在使用果园 1.6

4

1 回答 1

0

因此,问题似乎源于 Orchard 必须同时支持 SQL Server 和 SQL Compact,而 Compact Edition 不支持 VARBINARY(MAX) 的事实。我能看到的唯一前进方法是在 Orchard 中已有的东西之上创建我自己的模式构建器。我将采用的方法是创建一个自定义 CreateColumnCommand 和一个自定义 DataMigrationInterpreter(加上我需要的任何其他相关内容)来为我执行模式生成。一旦它工作,我会发布相关的代码。如果有人认为这种方法有缺陷,请大声疾呼!

编辑:但是,经过仔细检查,SQL Server CE 支持 Image 类型,所以我仍然不知道为什么 Orchard 无法做到这一点。在没有替代方案的情况下,将继续查看我的自定义解决方案。

于 2013-01-08T10:45:00.370 回答