【发布时间】:2013-01-25 14:34:06
【问题描述】:
在 SQL Server 中存储图像的正确方法是什么?有没有办法用 ADO.NET Entity Framework 存储它们?我需要一些很好的资源来了解如何以最好和现代的方式做到这一点。
【问题讨论】:
-
使用
FILESTREAM列类型。
标签: c# asp.net sql-server image entity-framework
在 SQL Server 中存储图像的正确方法是什么?有没有办法用 ADO.NET Entity Framework 存储它们?我需要一些很好的资源来了解如何以最好和现代的方式做到这一点。
【问题讨论】:
FILESTREAM 列类型。
标签: c# asp.net sql-server image entity-framework
如果您决定在 SQL Server 中存储图像,正确的方法是使用 FILESTREAM 类型。
有没有办法用 ADO.NET Entity Framework 来存储它们?
问题是 FILESTREAM 是 SQL Server 特定的列,而 EF 被设计为与数据库无关。因此,您可以在模型上拥有 byte[] 类型的属性,但 EF 不会利用流式传输。它将作为标准 varbinary(max) 加载。
您还可以使用本机 SqlFileStream 类直接处理 ADO.NET 中的 FILESTREAM 列类型。这是一个blog post,它显示了一个示例。
您可能还决定将文件存储在文件系统上,并仅将文件路径保存在数据库中。
【讨论】:
您可以以 varbinary 格式存储图像。在 sql 数据库表中创建 varbinary(MAX) 和 varchar(MAX) 类型的两列(您可以使用任何大小)并选中“允许空值”。
向您的实体模型添加两个属性:
public byte[] ImageData { get; set; } //Your image stored in binary data in the database
public string ImageMimeType { get; set; ) //just a string representation of Your image type,
//this property is optional )
到ImageMimeType你可以申请HiddenInputAttribute(DisplayValue=false)。你不需要将它应用到ImageData,因为框架没有可视化字节数组的编辑器。
将图像保存在数据库中:(如您所见,模型对象称为“产品”)
if (image != null) {
product.ImageMimeType = image.ContentType;
product.ImageData = new byte[image.ContentLength];
image.InputStream.Read(product.ImageData, 0, image.ContentLength);
}
希望这会有所帮助。
附言我将图像存储在文件流中,并将“文件路径”保留在数据库中。
【讨论】: