使用Entity Framework 6流式传输varbinary(max)数据

时间:2014-10-02 15:25:08

标签: c# .net sql-server entity-framework entity-framework-6

我有一个包含文件记录的SQL Server 2012表。每条记录都有varbinary(max)BlobData,表示存储在文件中的数据 - 数据大小可能超过1 GB,无法容纳到RAM中,所以我不希望它由字节数组支持。我想实现两个流操作:

  • 以块的形式顺序读取BlobData行到缓冲区;
  • 使用缓冲区以块的形式顺序覆盖BlobData行。

使用普通的ADO.NET,一种直接的方法是使用SqlDataReaderUPDATE .WRITE()

// 1. Sequentially read varbinary(max) into a buffer
using (SqlDataReader reader = sqlCommand.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
{   
    while (reader.Read())
    {
        byte[] buffer = new byte[size];

        while ((count = reader.GetBytes(0, offset, buffer, 0, buffer.Length)) > 0)
        {
            DoStuffWithBuffer(buffer);
            offset += count;
        }
    }
}

// 2. Sequentially overwrite varbinary(max) from a buffer - iterate:
UPDATE [File] SET [BlobData].WRITE(@buffer, @offset, @count)
WHERE [FileID]=@id

据我所知,此类操作过去不属于EF的范围,我最好的选择就是坚持使用ADO.NET。但是,我注意到EF6有一些新方法,例如EntityDataReader.GetBytes(),引用MSDN,»从指定列读取一个字节流,从dataIndex指示的位置开始,进入缓冲区,从bufferIndex«。

指示的位置开始
  1. 我的理解是EntityDataReader.GetBytes()SqlDataReader.GetBytes()相似,并且应该提供大致相似的表现 - 我是否正确或有其他考虑因素?

  2. EF6中是否有办法在UPDATE .WRITE(buffer, offset, count)列上执行与varbinary(max)类似的操作?

  3. 我的解决方案的其他部分使用EF6,因此为了保持一致性,我最好也希望使用EF6实现所有这些。

    鉴于新的EF6功能,可以/应该使用EF6实现此功能,还是应该像过去所建议的那样坚持使用ADO.NET?我正在使用.NET 4.0。

1 个答案:

答案 0 :(得分:1)

可能有点迟了 - 但context.Database.ExecuteSqlCommand接受流作为参数,即

var id = 1234;
var blobStream = await someSource.ReadAsStreamAsync(); // obtain some stream
db.Database.ExecuteSqlCommand($"UPDATE MyTable set BlobColumn=@p0 
                                where Id=@p1", blobStream, id);