最佳实践图像与城堡的ActiveRecord /单轨模型
-
19-09-2019 - |
题
我们的“用户”模式需要在一小资料图片,我不完全知道如何处理它。当然,我们可以只将其保存到磁盘上的文件夹和路径/文件名存储到数据库中,但我想我宁愿它存储在数据库本身。
我首先想到的是对这样的模型的属性:
[Property]
public byte[] ProfilePicture
{
get;
set;
}
但可以肯定的感觉就像我不得不走很长的路来得到它以这种方式工作 - 获得来自数据库的字节数组,然后将它与某种处理程序转换为图像
有没有人见过如何处理这样的事情一个很好的教程?看起来这将是一个足够常见的要求,我会找到单轨具体的,但到目前为止,我的搜索想出空。
解决方案
关于存储关于数据库或文件图像,请参阅这个问题 。
如果您决定将其存储在数据库中,最重要的是,您不每次查询用户的时间检索byte[]
,这可能是一个潜在的大量数据和中PERF的问题。要做到这一点,你可以要么将图像存储在另一个表或byte[]
用相同的表映射到另一个实体(假定用户只能有一个图片):
[ActiveRecord("users")]
public class UserWithoutPicture {
[PrimaryKey]
public virtual int Id {get;set;}
...
[BelongsTo]
public virtual UserProfilePicture ProfilePicture {get;set;}
}
[ActiveRecord("users")]
public class UserProfilePicture {
[PrimaryKey]
public virtual int Id {get;set;}
[Property]
public virtual byte[] Image {get;set;}
}
:此将具有虽然强>一些时髦的行为。例如,对于任何给定的用户来说,ProfilePicture
永远不会是空的。你不会真的插入或删除UserProfilePicture
,因为它实际上是用户,而不是你总是更新。你会产生额外的加入,你必须要知道的 SELECT N + 1个。这只是我的头顶部,完全未经测试
结论:在另一个表中存储的图像更加灵活
如果你想处理一个 Image
<方便/ A>而不是原始byte[]
,实施 IUserType
。但请记住,图像是IDisposable的,它会的很辛苦的在正确的时间处理它。
实现一个单轨控制器返回一个图像是相当简单...只是使用[ARFetch]
由ID获得UserProfilePicture
和写入与适当的内容类型的响应流。
不隶属于 StackOverflow