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

Max*_*ing 83 .net entity-framework sql-server-2008 ef-code-first

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

nim*_*ima 110

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

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 我看到使用这种技术的主要性能提升. (11认同)
  • 创建一个不包含文件图像列的视图,然后在EF中创建指向视图而不是表格的第二个实体,例如"ProductLite",这不是更简单吗? (3认同)

Cos*_*nea 61

只需将您的属性声明为像Ladislav提到的byte [].

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

    public string Name { get; set; }

    public byte[] ProductImage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是它.如果您没有映射属性,那么它将映射到a varbinary(max).如果数据库中有一个image列,则只需[Column(TypeName = "image")]在ProductImage属性上添加,或者如果您更喜欢代码映射,请将其添加到上下文类中的OnModelCreating覆盖:

modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");
Run Code Online (Sandbox Code Playgroud)

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


Lad*_*nka 42

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

编辑:

很少澄清 - 您可以FILESTREAM在数据库中使用,但EF不会利用流媒体.它将作为标准加载它varbinary(max).