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 (将#修改为@)