【发布时间】:2011-04-12 13:01:18
【问题描述】:
ASP.NET MVC 使得为简单的平面对象创建编辑模板变得非常容易。但是在使用 Fluent NHibernate 之类的东西时,为具有多个间接的复杂对象管理 CRUD 并不是那么明显。
示例
为了用一个简单的发票管理器来说明我的问题,Invoice 实体有一个 Project 属性:
public class Invoice
{
...
Project Project { get; set; } // where Project class has an Id and a Name
}
...通过我的InvoiceMap 中的 Fluent NHibernate 映射到 Projects 表:
References(x => x.Project).Inverse();
过去,我的 Invoice 实体有一个 ProjectId 属性,它引用了我数据库中的一个项目,这使得使用项目 ID 呈现选择列表变得更容易,但输出视图更难,例如:
public class Invoice
{
...
Guid ProjectID { get; set; }
}
但是自从我开始使用 Fluent NHibernate,我不想用更多的 ID 弄脏我的控制器。
InvoiceController
[HttpGet]
public ActionResult Edit(Guid id)
{
var invoice = _unitOfWork.CurrentSession.Get<Invoice>(id);
return View(invoice);
}
[HttpPost]
public ActionResult Edit(Invoice invoice)
{
/* How to deal with invoice.Project mapping here without introducing a second
action parameter, e.g. Guid projectId ? */
_unitOfWork.CurrentSession.SaveOrUpdate(invoice);
_unitOfWork.Commit();
return RedirectToAction("Details", new { id = invoice.Id });
}
引用的 Project 不应从我的 Invoice/Edit.cshtml 视图中编辑,但我希望能够选择 Invoice 应属于哪个项目。
我应该如何设计我的视图和控制器以使 CRUD 变得容易,而不会使我的控制器操作与非平面实体字段的引用 ID 混淆?
【问题讨论】:
标签: asp.net-mvc fluent-nhibernate controller crud