當我嘗試將文件保存到我的SQL Server數據庫時出現以下錯誤: 沒有從對象類型System.Data.Linq.Binary到已知的託管提供商本機類型MVC4代碼第一個實體框架上傳大文件到SQL Server數據庫
這裏是我的數據庫表:
CREATE TABLE [dbo].[FilesData](
[Id] [int] IDENTITY(1,1) NOT NULL,
[FileName] [nvarchar](50) NULL,
[FileData] [varbinary](max) NULL,
[FileExtension] [nvarchar](50) NULL,
這裏是我的存儲過程:
ALTER PROCEDURE [dbo].[sp_InsertFileData]
@FileName nvarchar(50),
@FileData varbinary(max),
@FileExtension nvarchar(50),
@result nvarchar(1) OUTPUT
AS
SET @result = '1'
INSERT INTO FilesData(FileName, FileData, FileExtension)
VALUES(@FileName,convert(varbinary(Max),@FileData),@FileExtension)
SELECT @result
這裏是我的CodeFirst類:
public class DataFile
{
[Key]
public virtual int Id { get; set; }
public virtual string FileName { get; set; }
public virtual byte[] FileData { get; set; }
public virtual string FileExtension { get; set; }
}
這裏是我的dbContect:
public class FileStreamDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
Configure(modelBuilder.Entity<DataFile>());
}
private void Configure(EntityTypeConfiguration<DataFile> datafiles)
{
datafiles.ToTable("DataFiles");
datafiles.Property(a => a.Id).HasColumnName("Id");
datafiles.Property(a => a.FileName).HasColumnName("FileName").IsOptional();
datafiles.Property(a => a.FileData).HasColumnName("FileData").IsOptional();
datafiles.Property(a => a.FileExtension).HasColumnName("FileExtension").IsOptional();
}
public DbSet<DataFile> datafiles { get; set; }
}
這裏是我的代碼:
byte[] fileData = new byte[file.InputStream.Length];
//add file input stream into byte array
file.InputStream.Read(fileData, 0, Convert.ToInt32(file.InputStream.Length));
//var newFileData = new Binary(fileData);
//create system.data.linq object using byte array
System.Data.Linq.Binary binaryFile = new System.Data.Linq.Binary(fileData);
using (var dataContext = new FileStreamDbContext())
{
//DataFile df = null;
//string query = "dbo.sp_InsertFileData,@FileName,@FileData, @FileExtension";
string fileName = Path.GetFileName(file.FileName);
string fileExtension = Path.GetExtension(file.FileName);
var fileNameParameter = new SqlParameter
{
SqlDbType = System.Data.SqlDbType.VarChar,
//DbType = DbType.String,
ParameterName = "FileName",
Value = fileName
};
var fileDataParameter = new SqlParameter
{
SqlDbType = System.Data.SqlDbType.VarBinary,
//DbType = DbType.Binary,
ParameterName = "FileData",
Value = binaryFile
};
var fileExtensionParameter = new SqlParameter
{
SqlDbType = System.Data.SqlDbType.VarChar,
//DbType = DbType.String,
ParameterName = "FileExtension",
Value = fileExtension
};
//var result = dataContext.Database.SqlQuery("EXEC dbo.sp_InsertFileData @FileName, @FileData, @FileExtension",
// fileName, newFileData, fileExtension).SingleOrDefault();
//var results = dataContext.Database.SqlQuery<DataFile>(query, fileNameParameter, fileDataParameter, fileExtensionParameter);
var results = dataContext.Database.ExecuteSqlCommand("exec dbo.sp_InsertFileData @FileName, @FileData, @FileExtension",
fileName, binaryFile, fileExtension);
任何和所有幫助表示讚賞。
爲什麼使用存儲過程將數據插入到已經映射到EF的表中? – Maess
你知道沒有存儲過程的方法嗎?如果可能且更簡單,我會很樂意在沒有存儲過程的情況下執行此操作 –
爲什麼在您的數據庫中放置大文件? – YesMan85