2012-04-07 25 views
9

Khi tôi muốn lưu trữ một tập tin trong một cột FileStream, tôi luôn luôn cần phải đọc toàn bộ nhị phân vào bộ nhớ:SQL FileStream + Entity cửa hàng khung file lớn

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

là có một cách nào đó với khuôn khổ thực thể , để đặt luồng trực tiếp? Bởi vì, nếu tôi muốn tải lên một tệp lớn, tôi sẽ nhận được một OutOfMemoryException.

+0

này có thể được giải quyết bằng cách sử dụng phương pháp tương tự http://stackoverflow.com/ câu hỏi/4441179/outofmemoryexception-khi-sử dụng-sql-filestream? Dường như sử dụng EntityFramework được trộn với kiểu kết nối cũ. – MadBoy

+0

vâng, nếu không có cách nào khác, tôi sẽ sử dụng điều này. cảm ơn bạn –

Trả lời

2

Không thấy bất kỳ cập nhật nào về hỗ trợ FILESTREAM trong EF. (Được đề cập trước đó là hỗ trợ một phần với .net 3.5 sp1 releasehere). Tôi cho rằng khung thực thể đang truy cập FILESTREAM thông qua TSQL và rõ ràng rằng bạn sẽ không thể nhận được các lợi ích hiệu suất trực tuyến của FILESTREAM. (cần đọc tất cả nội dung tệp vào bộ nhớ)

Vì vậy, cách tiếp cận được khuyến nghị đang sử dụng với SqlFileStream .Net API.

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

7

EF không có bất kỳ hỗ trợ nào cho FIlESTREAM. Nó xử lý tất cả các tương tác với FILESTREAM như là cột VARBINARY(MAX) bình thường, vì vậy nếu bạn muốn sử dụng phát trực tuyến, bạn phải sử dụng ADO.NET trực tiếp.

+6

Đưa ra câu trả lời 2 năm tuổi ... Bạn có biết điều này vẫn đúng ngày hôm nay không? – Vache

+0

Cũng có cùng một câu hỏi. Điều này vẫn đúng? – jpgrassi

+0

@jpgrassi: Tôi không nghĩ có bất kỳ thay đổi nào vì luồng tệp thực hoạt động như thế nào nhưng tôi chưa sử dụng EF trong một thời gian, vì vậy tôi có thể sai. –

0

Bạn có thể làm điều đó tuy nhiên nó đòi hỏi một số công việc thủ công. Yêu cầu kích hoạt FILESTREAM.

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

Bảng, chú ý IdFile cột unique rowguidcol not null mà là bắt buộc.

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 

Mô hình EF, cột IdFile không có mặt, chỉ chứa giá trị mặc định và không sử dụng cho chúng tôi. Nó chỉ được sử dụng bởi 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; } 
} 

Nguồn:

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

Các vấn đề liên quan