因为问题意味着我想将图像存储到文件系统中并在数据库中保存它的链接。 但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);
}
}
但是在repositor保存或更新项目之后,当我查看数据库时,图像为空。我尝试分配像图像名称一样的东西,它确实有效,但for image路径不起作用!!我很困惑为什么会这样。有没有人有任何想法?
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;
}
答案 0 :(得分:0)
我最好的猜测 - 保存没有被刷新到数据库。请参阅documentation:
ISession
会不时执行将ADO.NET连接状态与内存中保存的对象状态同步所需的SQL语句。此过程 flush 默认发生在以下几点
- 来自
的某些调用Find()
或Enumerable()
- 来自
NHibernate.ITransaction.Commit()
- 来自
ISession.Flush()
我的代码中没有看到任何会触发刷新的内容。在交易中包裹您的SaveOrUpdate
:
using (var trx = menuItemRepository.BeginTransaction())
{
menuItemRepository.SaveOrUpdate(item);
trx.Commit();
}
trx.Commit()
会将待处理的update
查询刷新到数据库。
答案 1 :(得分:0)
我为我的MVC应用程序实现了sessionPreRequest模块。所以我在那里做了commit()操作。
我查看并看到我的交易没有提交并且正在回滚。并检查错误,数据库中的图像列为nvarchar(50)
,但具有图像路径的字符串超过50个字符。所以我改为nvarchar(200)
,现在一切正常。