微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Entity Framework Core 5.0.0 blob 流与 SQLite?

如何解决Entity Framework Core 5.0.0 blob 流与 SQLite?

虽然可以使用 Microsoft.Data.sqlite 通过 ADO 将文件数据流式传输到 sqlite blob 字段:

public async Task<FileEntity> saveFileAsync(FileEntity file) {
//_DBCONTEXT from class constructor (DI)
  using (sqliteConnection con = _DBCONTEXT.Database.GetDbConnection() as sqliteConnection) {
    con.open();
    using (sqliteCommand cmd = con.CreateCommand()) {
    //Insert record with zeroed out FileData
      cmd.Transaction = tra;
      cmd.CommandText = "INSERT INTO [Files] ([FileName],[FileData]) VALUES (@FileName,@FileData)";
      cmd.Parameters.Add("@FileName",sqliteType.Text).Value = file.Name;
      cmd.Parameters.Add("@FileData",sqliteType.Blob).Value = new Byte[(Int64)file.Size];
      cmd.ExecuteNonQuery();
      cmd.Parameters.Clear();
      cmd.CommandText = "SELECT last_insert_rowid()";
      file.ID = Convert.ToInt32(cmd.ExecuteScalar());
    //Update record FileData with blob stream
      using (sqliteBlob blob = new sqliteBlob(con,"Files","FileData",(Int64)file.ID,false)) {
        await file.Data.copyToAsync(blob);
      }
    } //cmd
  } //con
}

其中 FileEntity 定义为:

public class FileEntity {
  public virtual Int32? ID { get; set; } = null;
  public virtual String Name { get; set; } = String.Empty;
  public virtual Int64? Size { get; set; } = null;
  public virtual Stream Data { get; set; } = null;
}

和EF映射定义为:

public class FileEntityEF : IEntityTypeConfiguration<FileEntity> {
  public void Configure(EntityTypeBuilder<FileEntity> builder) {
    builder.ToTable("Files");
    builder.HasKey(i => i.ID);
    builder.Property(n => n.Name)
      .HasColumnName("FileName")
      .HasColumnType("String")
      .Isrequired();
    builder.Property(d => d.Data)
      .HasColumnName("FileData")
      .HasColumnType("Blob")
      .Isrequired();
  }
}

}

并且一切正常......有没有办法直接在EF中做到这一点而不必用ADO取代它?到目前为止,我还没有找到可行的解决方案。尝试使用带有适当 sqliteParametersExecutesqlRawAsync() 来插入和更新,会导致以下异常:

No mapping to a relational type can be found for the CLR type 'MultipartReaderStream'.

as file.Data 在这种情况下是从 HTTP 请求分配 MultipartReaderStream 的。然而,ADO 方法并没有对这种不一致感到不满。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。