【问题标题】:SQL FileStream + Entity Framework store large filesSQL FileStream + Entity Framework 存储大文件
【发布时间】:2012-04-07 14:26:41
【问题描述】:

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

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

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

【问题讨论】:

  • 可以用类似的方法stackoverflow.com/questions/4441179/…解决吗?它似乎使用 EntityFramework 与旧类型的连接。
  • 是的,如果没有其他方法,我会使用这个。谢谢

标签: entity-framework filestream


【解决方案1】:

EF 不支持FIlESTREAM。它处理与FILESTREAM 的所有交互,就像正常的VARBINARY(MAX) 列一样,所以如果你想使用流,你必须直接使用ADO.NET。

【讨论】:

  • 戳一个 2 岁的答案......你知道今天这是否仍然正确吗?
  • 也有同样的问题。这仍然是真的吗?
  • @jpgrassi:我认为由于真实文件流的工作方式没有任何变化,但我已经有一段时间没有使用 EF,所以我可能错了。
  • 此链接可以提供帮助,floatincode.net/post/…
【解决方案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/

【讨论】:

    【解决方案3】:

    您可以做到,但需要一些手动工作。需要启用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2012-09-24
      相关资源
      最近更新 更多