因为这个问题暗示我想将图像存储到文件系统中并在数据库中保存指向它的链接。但 NHibernate 不会将文件路径保存在数据库中。这是代码:
[HttpPost]
public ActionResult Edit(Item item, HttpPostedFileBase image)
{
if (ModelState.IsValid)
{
if (image != null)
{
string imageName = image.FileName;
string location = Path.Combine(Server.MapPath("~/Content/Images/ItemImages/") , imageName);
image.SaveAs(location);
item.Image= imageName;
}
menuItemRepository.SaveOrUpdate(item);
// here the debug show the image path has correctly assigned to the image property
Debug.WriteLine(item.Image);
TempData["message"] = string.Format("{0} has been saved", item.Name);
return RedirectToAction("Index", item.Parent);
}
else
{
// there is something wrong with the data values
return View(Item);
}
}
但是在存储库保存或更新项目后,当我查看数据库时,图像为空。我试图分配一些像图像名称之类的东西,它确实有效,但 for 图像路径不起作用!!我很困惑为什么会发生这种情况。有人知道吗?
public class Item
{
public virtual string Image { get; set; }
}
public calss ItemMap : ClassMap<Item>
{
public ItemMap()
{
Map(x => x.Image).Length(100);
}
}
//////////存储 库
public T SaveOrUpdate(T entity)
{
session.SaveOrUpdate(entity);
return entity;
}
我最好的猜测 - 保存没有刷新到数据库。 请参阅文档:
ISession
会不时执行将 ADO.NET 连接的状态与内存中保存的对象的状态同步所需的 SQL 语句。此过程(刷新)默认在以下点发生
- 从某些调用
Find()
或Enumerable()
- 与
NHibernate.ITransaction.Commit()
相比- 与
ISession.Flush()
相比
我在您的代码中看不到任何会触发刷新的内容。 将您的SaveOrUpdate
包装在事务中:
using (var trx = menuItemRepository.BeginTransaction())
{
menuItemRepository.SaveOrUpdate(item);
trx.Commit();
}
trx.Commit()
会将该挂起的update
查询刷新到数据库。
我已经为我的 MVC 应用程序实现了一个 sessionPreRequest 模块,所以我在那里做 commit() 操作。我检查并看到我的交易没有提交并且正在回滚。并检查了错误,数据库中的图像列nvarchar(50)
,但图像路径的字符串超过 50 个字符。所以我改成nvarchar(200)
,现在一切正常。