【发布时间】:2011-06-06 21:19:52
【问题描述】:
我只是想弄清楚是否有一种使用 EF Code First CTP 5 存储和检索二进制(文件)数据的简单方法?我真的很希望它使用 FILESTREAM 类型,但我真的只是在寻找使其工作的方法。
【问题讨论】:
标签: .net entity-framework sql-server-2008 ef-code-first
我只是想弄清楚是否有一种使用 EF Code First CTP 5 存储和检索二进制(文件)数据的简单方法?我真的很希望它使用 FILESTREAM 类型,但我真的只是在寻找使其工作的方法。
【问题讨论】:
标签: .net entity-framework sql-server-2008 ef-code-first
您不能在 EF 中使用 SQL FILESTREAM。 EF 应该在不同的数据库服务器上工作,但文件流功能是 SQL 2008 和更新版本的特定功能。您可以尝试使用旧方法 - 在数据库表中使用 varbinary(max) 并在映射类中使用字节数组。
编辑:
一点说明 - 您可以在数据库中使用 FILESTREAM,但 EF 不会利用流式传输。它将作为标准varbinary(max) 加载。
【讨论】:
正如拉迪斯拉夫所说,只需将您的财产声明为 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 可以开箱即用。
【讨论】:
我总是创建另一个类,例如 ProductImage ,具有一对一关联,以管理延迟加载并规范化表:
public class ProductImage
{
public int ProductId { get; private set; }
public byte[] Image { get; set; }
}
【讨论】: