文件行为和加载时间长

时间:2014-02-25 00:24:45

标签: c# sql-server winforms nhibernate

我正在尝试使用MVCWindowsForms应用程序发送文件以选择文件,并将NHibernate作为ORM发送到数据库中。到目前为止,如此优秀,良好的计划和使用测试驱动开发我肯定在右侧。我的测试成功了,但是当我尝试通过应用程序直接上传内容时,需要花费大量时间来加载,我甚至得到调试器死锁警告。

我正在使用以下配置:

public EmailAttachmentMapping()
{
   Table("email_attachment");
   Id(e => e.Id, "ID");

   References(x => x.Template, "email_ID").Not.Nullable();
   Map(e => e.Title, "title").Not.Nullable();
   Map(x => x.Blob)
       //.CustomSqlType("VARBINARY (MAX) FILESTREAM")
       //.Length(2147483647)
         .Nullable();
}

...为我的附件。我的计划是将附件与电子邮件分开保存,因为这很明显。附件上的搜索和延迟加载更快。所以现在我尝试以下方法:

var dummyMail = Database.LoadEmailMock();
var file = @"C:\temp\test1.docx";

EmailManager etm = new EmailManager();
EmailAttachment attachmentWithFileNameAndBlob =       
etm.CreateAttachmentWithFileNameAndBlob(emailTemplateDummy, file, Database.GetBytesFromFile(file));

dummyMail.AddAttachment(attachmentWithFileNameAndBlob);

try
{
    using (ISession session = PersistenceContext.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        session.Save(emailTemplateDummy);
        session.Flush();
        transaction.Commit();
    }
}
catch (Exception ex)
{
    Assert.Fail(ex.Message);
}

使用测试MS-Test等情况并运行此代码可以高效地保存数据并从数据库中读取数据。正是我需要的。但现在出现了这样的事情:我在我的项目中使用了这个窗体,看起来很好的一切都很糟糕。加载时间非常长,所以我得到了那些“ContentSwitchDeadlock”情况,而只将184kb上传到varbinary。

任何人都知道那可能是什么?我正处于最深的调试模式,并且可以开启任何可以帮助我找到跟踪错误并解决此问题的方法!

1 个答案:

答案 0 :(得分:0)

好的,因为这里似乎没有答案,我使用LINQ2SQL作为处理文件管理的解决方法。对我来说似乎很合理。是的,我可以使用Microsoft DataAdapter和QueryParameter,但这取决于我对Linq2SQL的良好体验。

所以这就是诀窍:

IList<EmailAttachment> emailAttachments = null;

using (var session = PersistenceContext.OpenSession())
using (var transaction = session.BeginTransaction())
{
    // seperate attachments from email
    emailAttachments = model.Attachments;
    model.Attachments = null;

    session.Save(model);
    session.Flush();
    transaction.Commit();
}

//LINQ Solution to save attachments
if (emailTemplateAttachments != null)
{
    foreach (EmailAttachment attachment in emailAttachments)
    {
        FileHelperDBDataContext context = new FileHelperDBDataContext(_connectionString);
        LinqEmailAttachment linqClone = new LinqEmailAttachment();
        linqClone.blob = new System.Data.Linq.Binary(attachment.Blob);
        linqClone.title = attachment.Title;
        linqClone.email_template_ID = model.Id;

        context.LinqEmailTemplateAttachments.InsertOnSubmit(linqClone);
        context.SubmitChanges();
    }
}