流利的CRUD与NHibernate ASP.NET MVC(Fluent CRUD with NH

2019-09-29 02:25发布

ASP.NET MVC使得它可以很容易地创建简单,平面物体编辑模板。 但是,使用类似功能NHibernate当管理CRUD与几个间接性复杂对象,就不那么明显了。

为了说明一个简单的发票管理我的问题, 发票实体有项目属性:

public class Invoice
{
    ...
    Project Project { get; set; } // where Project class has an Id and a Name
}

......这是映射到Projects通过功能NHibernate表在我InvoiceMap

References(x => x.Project).Inverse();

在过去,我的发票实体将有一个ProjectId ,在我的数据库,这使得它更容易渲染项目ID的选择列表中引用的项目属性,但难以输出的看法,如:

public class Invoice
{
    ...
    Guid ProjectID { get; set; }
}

但自从我开始使用功能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 });
}

引用的项目不应该是从我的发票/ Edit.cshtml视图编辑的,但我希望能够选择哪一个项目的发票应该属于。

我应该如何设计我的视图和控制器,使CRUD方便,同时不会搞乱我的不平整实体字段引用的ID控制器动作?

Answer 1:

我建议你创建你的ProjectController动作(假设你有一个),其中有这简直是项目列表的局部视图。

 public class ProjectController : Controller
 {
      public ActionResult ProjectsList()
      {   
          var projects = GetAllProjects();
          return View(projects);
      }
 }

项目/ ProjectsList.cshtml

@model IEnumerable<MyProject.Data.Models.Project>
@{ Layout = null }
<select name="project">
 @foreach(var project in Model)
 {
   <option value="@project.Id">@project.Name</option>
 } 
</select>

发票/ Edit.cshtml

<label>Title</label>
<input name="title" />

@Html.Action("ProjectsList","Project")

然后我会改变你编辑的发票采取的输入模式,而不是直的发票和标识在行动查找项目。

HTH



文章来源: Fluent CRUD with NHibernate ASP.NET MVC