【发布时间】:2013-10-30 09:57:15
【问题描述】:
我创建了一个 MVC 4 并使用 NHibernate 来持久化模型并使用流利的 nhibernate 映射它。该实体有一个“名称”属性并以这种方式映射:
Map(x => x.Name).Not.Nullable().Length(100);
我创建了一个用于查看对象列表的表格,让我可以编辑、查看对象详细信息和删除它们。 当我删除对象时,视图层将模型 ID 回发到相应的控制器,控制器通过存储库对象尝试删除该对象。
[HttpPost]
public ActionResult DeleteElement(Element element)
{
Element deletedElement = repository.Delete(element);
TempData["message"] = string.Format("{0} has been deleted.",deletedElement.Name);
return RedirectToAction("Index");
}
表格视图的一部分:
<td>
@using (Html.BeginForm("DeleteMenu", "Admin"))
{
@Html.Hidden("ID", item.ID)
<input type="submit" value="Delete"/>
}
</td>
所以视图只会将 elemntID 回传给控制器。元素对象只有它的 ID。并且它的所有属性都是空的。当由于名称属性为空而尝试删除对象时,存储库中的会话对象无法删除该对象,因为名称字段为空。
错误信息:
not-null 属性引用了一个 null 或瞬态值 Element.Name
如果我只删除一个对象并拥有主键,为什么 nHibernate 关心其他字段是否为空? 以及如何仅删除带有 id 的对象?
public IQueryable<T> GetAll()
{
return session.Query<T>();
}
public IQueryable<T> Get(Expression<Func<T, bool>> predicate)
{
return GetAll().Where(predicate);
}
public void Delete(T entity)
{
session.Delete(entity);
}
【问题讨论】: