使用entity framework将文件保存在数据库中

我有一个基于Entity Framework和Microsoft SQL Server 2008的ASP.NET MVC解决方案。我需要创建一个允许我的用户上传文件的function。

我想要的是:

  • 使用entity framework在数据库中存储文件的解决方案
  • 一种解决方案,可以检测并阻止通过某种散列/校验和上载同一文件两次
  • 关于数据库/表格设计的提示

在SQL Server 2008数据库中存储文件的“正确”方法是使用FILESTREAM数据类型 。 我不知道entity framework支持这一点,但您当然可以尝试看看会发生什么。

也就是说,大多数时候人们这样做,他们不会将文件存储在数据库中。 这样做意味着您需要通过ASP.NET和数据库服务器来提供可以直接从Web服务器提供的文件。 它还可能使您的数据库和站点的备份图片有些复杂化。 因此,当我们将文件上传到MVC / Entity Framework时,我们只存储对数据库中文件位置的引用,并将文件本身存储在其他位置。

显然,哪种策略适合您,很大程度上取决于您的应用程序的详细信息。

在实体模型中,将BLOB数据库列映射到byte[]属性。 将上载文件的内容分配给实体对象的该属性,并将更改保存在ObjectContext

要计算哈希,可以使用MD5CryptoServiceProvider

这是我为Podcasts做的方式:


 ID标题路径摘要UploadDate
 --- ----- -------- ---------------- -----------
 1 TestPodcast /Podcasts/ep1.mp3测试播客2010-02-12

path存储对Podcast的物理位置的引用。 我使用了来自Scott Hanselman的文章上传与ASP.NET MVC的文章来处理文件上传部分。

根据@Thomas的回答,一个工作示例(仅用于文件上传,因为这个在谷歌中排在第一位):

 public void AddDocument(HttpPostedFileBase file) { try { using (TransactionScope scope = new TransactionScope()) { try { using (var ctx = new Entities()) { EntityDoc doc = new EntityDoc(); //The document table doc.DocumentFileName = file.FileName; //The file Name using (var reader = new System.IO.BinaryReader(file.InputStream)) { doc.DocumentFile = reader.ReadBytes(file.ContentLength); // the Byte [] Field } ctx.EntityDocs.Add(doc); ctx.SaveChanges(); scope.Complete(); } } catch (Exception ex) { throw ex; } } } catch (Exception ex) { throw ex; } }