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物体时避免加载的最佳做法是什么?
我的建议是你创建一个单独的实体(例如带有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)
朱莉
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |