2012-04-07 27 views
9

cuando quiero guardar un archivo en una columna FILESTREAM, que siempre tienen que leer todo el binario en la memoria:SQL FileStream + tienda entidad Marco de archivos de gran tamaño

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

¿hay alguna manera con el marco de la entidad , para poner la corriente directamente? Porque, si quiero subir un archivo grande, obtengo una OutOfMemoryException.

+0

Podría esto ser resueltos usando un método similar http://stackoverflow.com/ preguntas/4441179/outofmemoryexception-when-using-sql-filestream? Parece estar utilizando EntityFramework mezclado con el tipo de conexión anterior. – MadBoy

+0

sí, si no hay otra manera, usaré esto. gracias –

Respuesta

2

No se encontró ninguna actualización sobre el soporte de FILESTREAM en EF. (mencionado anteriormente como soporte parcial con .net 3.5 sp1 versiónhere). Supongo que el marco de entidad está accediendo a FILESTREAM a través de TSQL y es evidente que no podrá obtener los beneficios de rendimiento de transmisión de FILESTREAM. (necesita leer todo el contenido del archivo en la memoria)

Por lo tanto, el enfoque recomendado es utilizar con SqlFileStream .Net API.

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

7

EF no tiene ningún soporte para FIlESTREAM. Gestiona todas las interacciones con FILESTREAM como columna normal VARBINARY(MAX), por lo que si desea utilizar la transmisión debe utilizar ADO.NET directamente.

+6

Buscando una respuesta de 2 años ... ¿Sabes si esto sigue siendo cierto hoy? – Vache

+0

También tiene la misma pregunta. ¿Esto sigue siendo cierto? – jpgrassi

+0

@jpgrassi: No creo que haya ningún cambio debido a la forma en que funciona la secuencia de archivos real, pero no he usado EF durante bastante tiempo, por lo que podría estar equivocado. –

0

Puede hacerlo sin embargo, requiere un trabajo manual. Requiere FILESTREAM para ser habilitado.

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

tabla, observe la columna de la unique rowguidcol not null IdFile que se requiere.

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 

modelo de EF, la columna IdFile no está presente, sólo contiene los valores por defecto y es de ninguna utilidad para nosotros. Sólo se utiliza por 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; } 
} 

Fuente:

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

Cuestiones relacionadas