问题描述
虽然可以使用 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取代它?到目前为止,我还没有找到可行的解决方案。尝试使用带有适当 sqliteParameters 的 ExecutesqlRawAsync() 来插入和更新,会导致以下异常:
No mapping to a relational type can be found for the CLR type 'MultipartReaderStream'.
as file.Data 在这种情况下是从 HTTP 请求分配 MultipartReaderStream 的。然而,ADO 方法并没有对这种不一致感到不满。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)