Note that there are some explanatory texts on larger screens.

plurals
  1. POMVC4 Code First Entity Framework Upload large files to a SQL Server database
    text
    copied!<p>I get the following error when I try to save a file to my SQL Server database: No mapping exists from object type System.Data.Linq.Binary to a known managed provider native type.</p> <p>Here is my Database table:</p> <pre><code>CREATE TABLE [dbo].[FilesData]( [Id] [int] IDENTITY(1,1) NOT NULL, [FileName] [nvarchar](50) NULL, [FileData] [varbinary](max) NULL, [FileExtension] [nvarchar](50) NULL, </code></pre> <p>Here is my stored procedure:</p> <pre><code>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 </code></pre> <p>Here is my CodeFirst class:</p> <pre><code>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; } } </code></pre> <p>Here is my dbContect:</p> <pre><code>public class FileStreamDbContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); Configure(modelBuilder.Entity&lt;DataFile&gt;()); } private void Configure(EntityTypeConfiguration&lt;DataFile&gt; datafiles) { datafiles.ToTable("DataFiles"); datafiles.Property(a =&gt; a.Id).HasColumnName("Id"); datafiles.Property(a =&gt; a.FileName).HasColumnName("FileName").IsOptional(); datafiles.Property(a =&gt; a.FileData).HasColumnName("FileData").IsOptional(); datafiles.Property(a =&gt; a.FileExtension).HasColumnName("FileExtension").IsOptional(); } public DbSet&lt;DataFile&gt; datafiles { get; set; } } </code></pre> <p>here is my code:</p> <pre><code>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&lt;DataFile&gt;(query, fileNameParameter, fileDataParameter, fileExtensionParameter); var results = dataContext.Database.ExecuteSqlCommand("exec dbo.sp_InsertFileData @FileName, @FileData, @FileExtension", fileName, binaryFile, fileExtension); </code></pre> <p>Any and all help is appreciated.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload