【问题标题】:How to store images using Entity Framework Code First CTP 5?如何使用 Entity Framework Code First CTP 5 存储图像?
【发布时间】:2011-06-06 21:19:52
【问题描述】:

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

【问题讨论】:

    标签: .net entity-framework sql-server-2008 ef-code-first


    【解决方案1】:

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

    编辑:

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

    【讨论】:

      【解决方案2】:

      正如拉迪斯拉夫所说,只需将您的财产声明为 byte[]。

      public class Product
      {
          public int Id { get; private set; }
      
          public string Name { get; set; }
      
          public byte[] ProductImage { get; set; }
      }
      

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

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

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

      【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 创建一个不包含文件图像列的视图然后在 EF 中创建第二个指向视图而不是表的实体不是更简单吗? “产品精简版”
      • @C.List 我不敢相信我已经使用 EF 多年了,而且从来没有想过这样做。这是一个绝妙的想法,我只是把它付诸实践,摆脱了我用来做同样事情的不必要的观点。我们称它为“虚拟实体”:)
      猜你喜欢
      • 2016-08-04
      • 1970-01-01
      • 2011-06-11
      • 2014-05-08
      • 1970-01-01
      • 2011-03-18
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多