2012-04-07 14 views
9

quando voglio memorizzare un file in una colonna FileStream, ho sempre bisogno di leggere l'intero binario nella memoria:SQL FileStream + Entity negozio Framework file di grandi dimensioni

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

c'è un modo con Entity Framework , per mettere direttamente il flusso? Perché, se voglio caricare un file di grandi dimensioni, ottengo un OutOfMemoryException.

+0

Questo potrebbe essere risolto utilizzando il metodo simile http://stackoverflow.com/ domande/4441179/outofmemoryexception-when-using-sql-filestream? Sembra che utilizzi EntityFramework mescolato con il vecchio tipo di connessione. – MadBoy

+0

sì, se non c'è un altro modo, userò questo. grazie –

risposta

2

Non è stato visto alcun aggiornamento sul supporto FILESTREAM in EF. (Menzionato prima come supporto parziale con .net versione 3.5 sp1here). Suppongo che il framework delle entità stia accedendo a FILESTREAM tramite TSQL e che non sia possibile ottenere i vantaggi delle prestazioni di streaming di FILESTREAM. (è necessario leggere tutto il contenuto del file nella memoria)

Quindi, l'approccio consigliato è quello con l'API SqlFileStream .Net.

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

7

EF non ha alcun supporto per FIlESTREAM. Gestisce tutte le interazioni con FILESTREAM come normale colonna VARBINARY(MAX), quindi se si desidera utilizzare lo streaming è necessario utilizzare direttamente ADO.NET.

+6

Poking a 2 anni risposta ... Sai se questo è ancora vero oggi? – Vache

+0

Anche avere la stessa domanda. È ancora vero? – jpgrassi

+0

@jpgrassi: Non penso che ci sia stato alcun cambiamento a causa di come funziona il vero flusso di file, ma non uso EF da un po 'di tempo, quindi potrei sbagliarmi. –

0

Si può fare ma richiede un po 'di lavoro manuale. Richiede l'attivazione di FILESTREAM.

https://docs.microsoft.com/en-us/sql/relational-databases/blob/enable-and-configure-filestream

Tavolo, notare la colonna unique rowguidcol not null IdFile che è richiesto.

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 

Modello EF, colonna IdFile non è presente, contiene solo valori predefiniti e non è utile per noi. Viene utilizzato solo da 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; } 
} 

Fonte:

http://www.floatincode.net/post/sql-file-stream-in-asp.net-mvc-with-entity-framework

Problemi correlati