#asp.net-mvc #fluent-nhibernate #automapper #loose-coupling
#asp.net-mvc #свободно-nhibernate #automapper #слабая связь
Вопрос:
У меня есть свойство InvoiceInputModel
with ProjectId
, которое является ссылкой на Project
сущность. В идеале, я хочу, чтобы AutoMapper мог отображать всю Invoice
сущность из InvoiceInputModel
, которая выглядит следующим образом:
public class InvoiceInputModel
{
public Guid Id { get; set; }
public DateTime Date { get; set; }
public string Reference { get; set; }
public Guid ProjectId { get; set; }
}
Очевидно, что следующее плохо:
Mapper.CreateMap<InvoiceInputModel, Invoice>()
.ForMember(src => src.Project, opt => opt.MapFrom(
dest => _unitOfWork.CurrentSession.Get<Project>(dest.ProjectId)
)
);
Как мне сообщить AutoMapper, который invoice.Project
должен быть сопоставлен с Project
объектом, основанным на ProjectId
свойстве в InvoiceInputModel
, сохраняя при этом слабую связь?
Счет / Редактирование в моем InvoiceController
:
[HttpPost]
[Authorize]
public ActionResult Edit(InvoiceInputModel invoiceInputModel)
{
var invoice = _unitOfWork.CurrentSession.Get<Invoice>(invoiceInputModel.Id);
Mapper.Map<InvoiceInputModel, Invoice>(invoiceInputModel, invoice);
invoice.Project = _unitOfWork.CurrentSession.Get<Project>(invoiceInputModel.ProjectId);
// I want AutoMapper to do the above.
_unitOfWork.CurrentSession.SaveOrUpdate(invoice);
_unitOfWork.Commit();
return View(invoice);
}
Я заметил кое-что о «Распознавателях» и ResolveUsing, но у меня нет опыта их использования.
Как мне сказать AutoMapper сделать это, сохраняя слабую связь между моими моделями сущностей, моделями ввода и моделями просмотра? Или есть способ получше?
Ответ №1:
Как мне сообщить AutoMapper об этом счете.Проект должен быть сопоставлен с объектом Project на основе свойства ProjectID в InvoiceInputModel, сохраняя при этом слабую связь?
Вы не можете. Если AutoMapper отправляется куда-то еще для извлечения данных, то он не является свободно связанным.
Вы все равно не изменяете Project
в этом конкретном представлении — зачем вам нужно устанавливать отношение на Project
, разве NHibernate недостаточно умен, чтобы видеть, что свойство не изменилось, и ничего не делать?
Ответ №2:
У меня лично есть объекты в viewmodels вместо идентификаторов, так что привязка происходит автоматически.
http://sprokhorenko.blogspot.com/2011/03/bind-to-entity-id.html