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 простым, не загромождая действие моего контроллера ссылочными идентификаторами, которые не являются плоскими полями сущностей?