c# – 使用Entity Framework 6的流式varbinary(max)数据

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

>将块中的BlobData行顺序读取到缓冲区中;
>使用缓冲区以块的形式顺序覆盖aBlobData行.

使用普通的ADO.NET,一种直接的方法是使用sqlDataReader和UPDATE .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,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«表示.

>我的理解是EntityDataReader.GetBytes()类似于sqlDataReader.GetBytes()并且应该提供大致相似的性能 – 我是正确的还是有其他考虑因素?
>在EF6中是否有办法在varbinary(max)列上执行类似于UPDATE .WRITE(缓冲区,偏移量,计数)的操作?

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

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

解决方法

可能有点晚 – 但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);

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...