SQL FileStream + Entity Framework存储大文件

时间:2012-04-07 14:26:41

标签: entity-framework filestream

当我想将文件存储在文件流列中时,我总是需要将整个二进制文件读入内存:

using (MemoryStream memoryStream = new MemoryStream())
{
   sourceStream.CopyTo(memoryStream);
   binaryStore.Content = memoryStream.ToArray(); //Content = filestream column
}

是否有实体框架的方法,直接放流?因为,如果我想上传一个大文件,我会得到一个OutOfMemoryException。

3 个答案:

答案 0 :(得分:7)

EF对FIlESTREAM没有任何支持。它处理与FILESTREAM作为普通VARBINARY(MAX)列的所有互动,因此如果您想使用流媒体,则必须直接使用ADO.NET。

答案 1 :(得分:2)

在EF中没有看到有关FILESTREAM支持的任何更新。 (以前作为.net 3.5 sp1发布的部分支持提及 here)。我认为实体框架正在通过TSQL访问FILESTREAM,并且显然您将无法获得FILESTREAM的流性能优势。 (需要将所有文件内容读入内存

因此,建议的方法是使用SqlFileStream .Net API。

http://lennilobel.wordpress.com/2011/08/22/using-sqlfilestream-in-c-to-access-sql-server-filestream-data/

答案 2 :(得分:0)

你可以这样做,但它需要一些手动工作。需要FILESTREAM启用。

https://docs.microsoft.com/en-us/sql/relational-databases/blob/enable-and-configure-filestream

表,请注意所需的unique rowguidcol not null IdFile列。

CREATE TABLE [dbo].[Files](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [IdFile] [uniqueidentifier] unique ROWGUIDCOL  NOT NULL,
    [Title] [nvarchar](max) NULL,
    [File] [varbinary](max) FILESTREAM  NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [id] ASC
))

GO

ALTER TABLE [dbo].[Files] ADD  CONSTRAINT [DF_Files_IdFile]  DEFAULT (newid()) FOR [IdFile]
GO

EF模型,IdFile列不存在,它只包含默认值,对我们没用。它仅由SQL Server使用:

[Table("Files")]
public class FileModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public byte[] File { get; set; }
}

VM:

public class FileViewModel
{
    public string Title { get; set; }
    public HttpPostedFileBase File { get; set; }
}

来源:

http://www.floatincode.net/post/sql-file-stream-in-asp.net-mvc-with-entity-framework