当我想将文件存储在文件流列中时,我总是需要将整个二进制文件读入内存:
using (MemoryStream memoryStream = new MemoryStream())
{
sourceStream.CopyTo(memoryStream);
binaryStore.Content = memoryStream.ToArray(); //Content = filestream column
}
是否有实体框架的方法,直接放流?因为,如果我想上传一个大文件,我会得到一个OutOfMemoryException。
答案 0 :(得分:7)
EF对FIlESTREAM
没有任何支持。它处理与FILESTREAM
作为普通VARBINARY(MAX)
列的所有互动,因此如果您想使用流媒体,则必须直接使用ADO.NET。
答案 1 :(得分:2)
在EF中没有看到有关FILESTREAM支持的任何更新。 (以前作为.net 3.5 sp1发布的部分支持提及 here)。我认为实体框架正在通过TSQL访问FILESTREAM,并且显然您将无法获得FILESTREAM的流性能优势。 (需要将所有文件内容读入内存)
因此,建议的方法是使用SqlFileStream
.Net API。
答案 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