关于将图像存储在数据库或文件中,请参阅此问题。
如果您决定将其存储在数据库中,最重要的是您不会在每次查询用户时都检索它byte[]
,这可能是大量数据和性能问题。为此,您可以将图像存储在另一个表中或将图像映射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;}
}
不过,这会有一些古怪的行为。例如,对于任何给定的用户,theProfilePicture
永远不会为空。您不会真正插入或删除UserProfilePicture
,因为它实际上是用户,而是您总是会更新。而且你会招致额外的加入,你必须知道SELECT N+1。这只是我的想法,完全未经测试。
结论:将图像存储在另一个表中要灵活得多。
如果您想方便地处理 anImage
而不是 raw byte[]
,请实现IUserType
. 但请记住,Image 是一个 IDisposable,并且很难在正确的时间处理它。
Implementing a Monorail controller that returns an image is quite straightforward... just use [ARFetch]
to get the UserProfilePicture
by id and write to the Response stream with the appropriate content-type.