Свободный CRUD с NHibernate ASP.NET MVC - PullRequest
1 голос
/ 12 апреля 2011

ASP.NET MVC позволяет действительно легко создавать шаблоны редактирования для простых, плоских объектов. Но управление CRUD для сложных объектов с несколькими косвенными ссылками при использовании чего-то вроде Fluent NHibernate не столь очевидно.

Пример

Чтобы проиллюстрировать мой вопрос с помощью простого менеджера счетов, Счет сущностей имеют свойство Project :

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

... который отображается в таблицу Projects через Fluent NHibernate в моем InvoiceMap:

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

Раньше у моих сущностей Invoice было свойство ProjectId, которое ссылалось на проект в моей базе данных, что облегчало рендеринг списка выбора с идентификаторами проекта, но затрудняло вывод представлений, например ::

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

Но так как я начал использовать Fluent NHibernate, я не хочу загрязнять свой контроллер большим количеством идентификаторов.

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 });
}

Ссылочный Проект не должен редактироваться в моем представлении Invoice / Edit.cshtml , но я хочу иметь возможность выбрать, к какому проекту должен принадлежать Счет-фактура.

Как мне спроектировать мои представления и контроллеры, чтобы сделать CRUD простым, не загромождая действие моего контроллера ссылочными идентификаторами, которые не являются плоскими полями сущностей?

1 Ответ

0 голосов
/ 12 апреля 2011

Я бы посоветовал вам создать действие на вашем 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 в этом действии.

НТН

...