【问题标题】:Storing binary data with metadata使用元数据存储二进制数据
【发布时间】:2011-12-07 14:30:42
【问题描述】:

使用 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;

具体来说,我们只在极少数情况下需要图像的实际Bytes,因此除非我们请求,否则不希望加载它。

当您需要实际的 Image 对象时,避免加载 Bytes 的最佳做法是什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    [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 朱莉

    【讨论】:

    • 这正是我们所需要的。我们最终混合了流利和数据注释,因为我们找不到 HasRequired 和 WithRequiredPrincipal 的等价物作为数据注释。
    • 啊是啊...默认情况下,如果您不提供一些线索,代码优先不知道如何处理 1:1 关系(无论是在代码中,以便约定可以接受它)或在配置中)关于哪个是主体,哪个是从属。如果您想坚持使用 Data Annotations,您可以将 ImageBytes 类的 Id 属性标记为 ForeignKey,这足以让约定说“啊,那必须是依赖项”
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2012-02-21
    • 2010-11-09
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多