9

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

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

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

4

3 回答 3

7

EF 不支持FIlESTREAM. 它处理与FILESTREAM普通VARBINARY(MAX)列的所有交互,因此如果要使用流式传输,则必须直接使用 ADO.NET。

于 2012-04-07T16:31:50.710 回答
2

未在 EF 中看到有关 FILESTREAM 支持的任何更新。(之前提到过 这里对 .net 3.5 sp1 版本的部分支持)。我想实体框架正在通过 TSQL 访问 FILESTREAM,显然您将无法获得 FILESTREAM 的流式传输性能优势。(需要将所有文件内容读入内存

因此,推荐的方法是使用SqlFileStream.Net API。

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

于 2012-04-07T16:34:48.300 回答
1

你可以做到,但它需要一些手动工作。需要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; }
}

虚拟机:

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

于 2017-06-14T09:27:32.207 回答