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

Veg*_*sen 4 entity-framework lazy-loading entity-framework-4 ef-code-first

使用Entity Framework 4.2 Code首先,我们希望将一些图像数据存储在我们的数据库中.图像很小,只要我们可以缓存在磁盘上.

但是,我们经常需要一些与图像一起存储的元数据(例如它的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;
Run Code Online (Sandbox Code Playgroud)

具体来说,我们只想Bytes在极少数情况下使用图像的实际情况,因此除非我们要求,否则不要加载它.

Bytes在需要实际Image物体时避免加载的最佳做法是什么?

Jul*_*man 6

我的建议是你创建一个单独的实体(例如带有Id和Bytes的ImageBytes),专门用于包含Bytes的字段,并使其与Image实体(具有Id和MimeType)相关.您可以使用名为Table Splitting的功能(在EDMX和COde First中),您可以将多个实体映射到单个数据库表.然后,您可以查询图像实体,EF只会从数据库中选择必要的列.您可以通过在Image和ImageBytes之间定义的关系访问字节.然后,您可以执行预先加载,延迟加载或显式加载来检索图像字节.

如果您正在使用数据注释,您所要做的就是为两个实体指定表:

[Table("Image")]
public class Image
{}

[Table("Image")]
public class ImageBytes
{}
Run Code Online (Sandbox Code Playgroud)

使用流畅的API

modelBuilder.Entity<Image>()
            .HasRequired(e => e.Bytes)
            .WithRequiredPrincipal();

modelBuilder.Entity<Image>().ToTable("Image");
modelBuilder.Entity<ImageBytes>().ToTable("Image");
Run Code Online (Sandbox Code Playgroud)

朱莉