目前我们正在数据库中保存文件(或者更好:它们的内容作为流)。
<class name="File"
table="tblFile"
lazy="false">
<id name="_id"
column="Id"
access="field" >
<generator class="native"/>
</id>
<property name ="_businessId"
column="BusinessId"
not-null="true"
access="field" />
<property name="_name"
column="Filename"
not-null="true"
access="field" />
<property name="_mimeType"
column="Mime"
not-null="true"
access="field" />
<property name="_content"
column="Content"
length="2147483647"
not-null="true"
access="field" />
<property name="_fileType"
column="FileType"
not-null="true"
access="field" />
</class>
总而言之,到目前为止,这一切都运作良好,除非存在一些问题:例如,您无法保存大于 2gb 的文件。
所以我们现在正在寻找更好的解决方案。如果您不将文件保存在数据库中,则必须将它们保存在磁盘上。为了不重新实现整个持久化过程,我们考虑实现一个自定义用户类型 (IUserType),它将文件保存在磁盘上并将文件名存储在数据库中。
NullSafeSet 会将文件保存在磁盘上并将位置存储在数据库中,而 NullSafeGet 将(懒惰地)返回从数据库中的文件名创建的流。
我们在该解决方案中发现了一些优点,但也发现了一些缺点:
优点: - 除了实现 UserType 和最小限度地更改映射文件 - 将文件保存在磁盘上 - ... 没有更改代码 - ...
缺点: - 在哪里处理由 UserType 创建的流 - 保存文件的固定文件夹(到目前为止对我们来说没有问题) - 可能会减慢 nhibernate - ...
所以现在我们想知道将文件保存在磁盘上的 UserType 是否是一个疯狂的想法,或者是否值得研究以解决缺点?