如何使用Entity Framework Code First CTP 5存储图像?


Answers:


41

您不能FILESTREAM在EF中使用SQL 。EF应该在不同的数据库服务器上运行,但是文件流功能是SQL 2008和更高版本的特定功能。您可以尝试以旧方式进行操作-varbinary(max)在数据库表中使用,并在映射的类中使用字节数组。

编辑:

很少澄清-您可以FILESTREAM在数据库中使用,但EF不会利用流式传输的优势。它将作为标准加载varbinary(max)


112

我总是ProductImage用一对一关联创建另一个类,以管理延迟加载并规范化表:

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}

4
创建一个不包含文件图像列的视图,然后在EF中创建另一个指向该视图而不是表的实体会不会更简单-例如,“ ProductLite”
C.List

@ C.List我简直不敢相信我已经使用EF多年了,从没想过要这样做。这是一个很棒的想法,我只是把它运用了一下,摆脱了我用来做同一件事的不必要的观点。我们称它为“虚拟实体” :)
Greg Gum 2015年

65

就像Ladislav提到的那样,只需将您的属性声明为byte []即可。

public class Product
{
    public int Id { get; private set; }

    public string Name { get; set; }

    public byte[] ProductImage { get; set; }
}

就是这样。如果您不映射该属性,则约定将映射到varbinary(max)。如果数据库中已经有图像列,则只需添加[Column(TypeName = "image")]ProductImage属性,或者如果您更喜欢代码映射,请将其添加到上下文类的OnModelCreating覆盖中:

modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");

我遇到的问题是,我没有找到一种使属性变得懒惰的方法,因为我不一定每次获取产品时都加载二进制数据。我不确定我是否记得正确,但是NHibernate可以开箱即用。


是的,NHibernate可以开箱即用地进行特定于列的延迟加载:ayende.com/blog/4377/nhibernate-new-feature-lazy-properties
gabe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.