9

Вопрос по entity-framework – SQL FileStream + Entity Framework хранит большие файлы

Когда я хочу сохранить файл в столбце filestream, мне всегда нужно прочитать весь двоичный файл в память:

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

Есть ли способ с структурой лица, чтобы поставить поток напрямую? Потому что, если я хочу загрузить большой файл, я получаю исключение OutOfMemoryException.

  • @jpgrassi: я не думаю, что произошли какие-либо изменения из-за того, как работает настоящий файловый поток, но я не использую EF в течение достаточно долгого времени, поэтому я могу ошибаться.

    от
  • Тыкаешь 2 года ответа ... Ты знаешь, правда ли это сегодня?

    от
  • Также есть тот же вопрос. Это все еще правда?

    от
  • Эта ссылка может помочь,floatincode.net/post/…

    от
  • Может ли это быть решено с помощью аналогичного методаstackoverflow.com/questions/4441179/… ? Кажется, он использует EntityFramework, смешанный со старым типом соединения.

    от MadBoy
  • да, если нет другого пути, я буду использовать это. благодарю вас

    от Kaffee Bohne
  • 7

    EF не поддерживает

    FIlESTREAM, Он обрабатывает все взаимодействия сFILESTREAM как обычноVARBINARY(MAX) столбец, так что если вы хотите использовать потоковую передачу, вы должны использовать ADO.NET напрямую.

  • 2

    Не видел обновлений о поддержке FILESTREAM в EF. (Mentioned before as

    partial support with .net 3.5 sp1 release Вот). Я полагаю, что структура сущностей обращается к FILESTREAM через TSQL, и очевидно, что вы не сможете получить преимущества потоковой производительности FILESTREAM. (need to read all file content into memory)

    Итак, рекомендуемый подход используетSqlFileStream .Net API.

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

  • 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