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

9

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

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

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

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

Ваш Ответ

3   ответа
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

7

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

@jpgrassi: я не думаю, что произошли какие-либо изменения из-за того, как работает настоящий файловый поток, но я не использую EF в течение достаточно долгого времени, поэтому я могу ошибаться.
Также есть тот же вопрос. Это все еще правда?
Тыкаешь 2 года ответа ... Ты знаешь, правда ли это сегодня?
Эта ссылка может помочь,floatincode.net/post/…
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/

Похожие вопросы