私は MVC 4 を作成し、NHibernate を使用してモデルを永続化し、流暢な nhibernate でマッピングしました。エンティティには「Name」プロパティがあり、次のようにマッピングされます。
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 しかありません。name プロパティが null であるためオブジェクトを削除しようとすると、名前フィールドが null であるため、リポジトリ内のセッション オブジェクトはオブジェクトを削除できません。
エラーメッセージ:
null 以外のプロパティが null または一時的な値 Element.Name を参照しています
オブジェクトを削除するだけで主キーがある場合、nHibernate が他のフィールドが null であることを気にするのはなぜですか? どうすれば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);
}