【问题标题】:Save files in database with entity framework使用实体框架将文件保存在数据库中
【发布时间】:2011-01-18 07:00:39
【问题描述】:

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

我想要的是:

  • 使用实体框架将文件存储在数据库中的解决方案
  • 一种通过某种哈希/校验和检测并防止两次上传同一文件的解决方案
  • 数据库/表设计技巧

【问题讨论】:

    标签: c# .net asp.net-mvc entity-framework upload


    【解决方案1】:

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

    要计算哈希,您可以使用MD5CryptoServiceProvider

    【讨论】:

    • 这个答案有什么问题?你能至少给出一个反对票的理由吗?这是我真正讨厌的一件事:那些没有解释就投反对票的人......这太没用了
    • 不知道...但请为您的麻烦+1。 :)
    • 这方面的坏处是大文件可能会通过使用字节数组而不是流来炸毁你的 RAM :(
    【解决方案2】:

    在 SQL Server 2008 数据库中存储文件的“正确”方式是到use the FILESTREAM data type。我不知道实体框架是否支持这一点,但您当然可以尝试看看会发生什么。

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

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

    【讨论】:

    • 链接失效了。
    【解决方案3】:

    以下是我在播客中的做法:

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

    path 存储对 Podcast 物理位置的引用。我使用了 Scott Hanselman 在File Uploads with ASP.NET MVC 上的帖子来处理文件上传部分。

    【讨论】:

    • 这对于小型应用程序来说可能没问题,但假设一个具有备份要求和文件随时间变化的复杂应用程序,您将无法及时返回到特定时间点
    • @Ozz 你说得对;但这不适用于随时间变化的文件。我的希望是,一旦你发布了一个播客,你就不会回去覆盖那个播客了。
    【解决方案4】:

    基于@Thomas 的回答的一个工作示例(仅用于文件上传,因为这个在 google 中是第一位的):

    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;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多