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

w12*_*128 5 .net c# 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
Run Code Online (Sandbox Code Playgroud)

据我所知,这些操作过去不在EF的范围内,我最好的选择就是简单地坚持使用ADO.NET。但是,我注意到EF6有一些新方法,例如用MSDNEntityDataReader.GetBytes()引用»从指定列开始,将字节流从dataIndex指示的位置读取到缓冲区,从bufferIndex«指示的位置开始。

  1. 我的理解是,EntityDataReader.GetBytes()SqlDataReader.GetBytes()应该类似于并且应该提供大致类似的性能-我是对的还是其他考虑因素?

  2. 是否有EF6的方式进行类似的操作UPDATE .WRITE(buffer, offset, count)varbinary(max)列?

我的解决方案的其他部分都使用EF6,因此,为了保持一致,我也希望同时使用EF6来实现所有这些功能。

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

小智 2

也许有点晚了 - 但 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);
Run Code Online (Sandbox Code Playgroud)