85

我只是想弄清楚是否有一种简单的方法可以使用 EF Code First CTP 5 存储和检索二进制(文件)数据?我真的很希望它使用 FILESTREAM 类型,但我真的只是在寻找一些让它工作的方法。

4

3 回答 3

117

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

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}
于 2011-06-05T05:45:09.920 回答
67

只需将您的财产声明为 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 可以开箱即用。

于 2011-01-16T12:54:52.237 回答
42

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

编辑:

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

于 2011-01-11T08:42:38.043 回答