【发布时间】:2014-01-04 08:04:09
【问题描述】:
当我尝试将文件保存到我的 SQL Server 数据库时出现以下错误: 不存在从对象类型 System.Data.Linq.Binary 到已知托管提供程序本机类型的映射。
这是我的数据库表:
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 的表中?
-
你知道没有存储过程的方法吗?如果可能并且更简单,我很乐意在没有存储过程的情况下这样做
-
为什么要在数据库中放置大文件?
标签: c# sql sql-server entity-framework asp.net-mvc-4