使用Entity Framework 4.2代码首先,我们希望将一些图像数据存储在我们的数据库中。图像很小,只要我们可以缓存在磁盘上。
但是,我们经常需要一些与图像一起存储的元数据(例如它的MIME类型),而不是实际的图像数据。
public class Item
{
public int Id { get; set; }
//...
public Image Image { get; set; }
}
public class Image
{
public int Id { get; set; }
public String MimeType { get; set; }
public byte[] Bytes { get; set; }
}
// this also loads Bytes:
var item = _db.Items.Include("Image").Find(1);
var mimeType = item.Image.MimeType;
具体来说,我们只想在极少数情况下使用图像的实际Bytes
,因此除非我们要求,否则不要加载它。
当您需要实际Bytes
个对象时,避免加载Image
的最佳做法是什么?
答案 0 :(得分:6)
我的建议是,您专门为包含字节的字段创建一个单独的实体(例如,带有Id和字节的ImageBytes),并使其与Image实体(具有Id和MimeType)相关。您可以使用名为Table Splitting的功能(在EDMX和COde First中),您可以将多个实体映射到单个数据库表。然后,您可以查询图像实体,EF只会从数据库中选择必要的列。您可以通过在Image和ImageBytes之间定义的关系访问字节。然后,您可以执行预先加载,延迟加载或显式加载来检索图像字节。
如果您正在使用数据注释,您所要做的就是为两个实体指定表格:
[Table("Image")]
public class Image
{}
[Table("Image")]
public class ImageBytes
{}
使用流畅的API
modelBuilder.Entity<Image>()
.HasRequired(e => e.Bytes)
.WithRequiredPrincipal();
modelBuilder.Entity<Image>().ToTable("Image");
modelBuilder.Entity<ImageBytes>().ToTable("Image");
HTH 朱莉