【问题标题】:Fluent CRUD with NHibernate ASP.NET MVC使用 NHibernate ASP.NET MVC 的流畅 CRUD
【发布时间】: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


    【解决方案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")
    

    然后我会更改您编辑发票以采用输入模型而不是直接发票,并在该操作中按 Id 查找项目。

    HTH

    【讨论】:

    • 谢谢!刚刚找到了一个good link,其中包含一个使用视图模型作为发票/编辑操作输入的示例。不过,我总是觉得“视图模型”这个词令人困惑。
    • @Rob,如何修改 Invoice EditorTemplate 以便 Invoice/Edit 视图可以使用 Html.EditorFor(invoice =&gt; x.Project) 语法?如果可能,如何将其连接到我的ProjectController
    • 我倾向于称它们为 InputModel 和 ViewData 以避免混淆术语。
    • @FreshCode 我不确定 EditorFor 是否可以做一个复杂的编辑器。
    • 您是否使用 AutoMapper 来映射您的字段?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多