2013-12-16 16 views
1

當我嘗試將文件保存到我的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); 

任何和所有幫助表示讚賞。

+0

爲什麼使用存儲過程將數據插入到已經映射到EF的表中? – Maess

+0

你知道沒有存儲過程的方法嗎?如果可能且更簡單,我會很樂意在沒有存儲過程的情況下執行此操作 –

+1

爲什麼在您的數據庫中放置大文件? – YesMan85

回答

1

你的問題是在這裏:

System.Data.Linq.Binary binaryFile = new System.Data.Linq.Binary(fileData); 

原始字節數組只是存儲在你的實體屬性,它應該工作。

byte[] fileData = new byte[file.InputStream.Length]; 
file.InputStream.Read(fileData, 0, Convert.ToInt32(file.InputStream.Length)); 
using (var dataContext = new FileStreamDbContext()) 
{ 
    var entity = new DataFile 
    { 
     FileName = Path.GetFileName(file.FileName), 
     FileExtension = Path.GetExtension(file.FileName), 
     FileData = fileData, 
    }; 
    dataContext.Create(entity); 
    dataContext.SaveChanges(); 
} 
+0

當我這樣做時,我得到一個新的錯誤: –

+0

當我這樣做時,我得到一個新的錯誤:必須聲明標量變量「@FileName」。有任何想法嗎? –

+0

您需要從存儲過程中取消映射此實體的創建。只要讓EF處理它,不用sprocs。 – danludwig

相關問題