我正在尝试使用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。
任何人都知道那可能是什么?我正处于最深的调试模式,并且可以开启任何可以帮助我找到跟踪错误并解决此问题的方法!
答案 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();
}
}