使用元数据存储二进制数据

时间:2011-12-07 14:30:43

标签: entity-framework entity-framework-4 ef-code-first lazy-loading

使用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的最佳做法是什么?

1 个答案:

答案 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 朱莉