1

我有InvoiceInputModel一个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实体?ProjectIdInvoiceInputModel

我的发票/编辑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 这样做,同时保持实体模型、输入模型和视图模型之间的松散耦合?或者,还有更好的方法?

4

2 回答 2

0

我个人在视图模型中有实体而不是 ID,因此绑定会自动发生。

http://sprokhorenko.blogspot.com/2011/03/bind-to-entity-id.html

于 2011-04-12T17:45:58.830 回答
0

如何告诉 AutoMapper invoice.Project 应该根据 InvoiceInputModel 中的 ProjectId 属性映射到 Project 实体,同时保持松散耦合?

你不能。如果 AutoMapper 要去其他地方获取数据,那么它就不是松散耦合的。

无论如何,您都没有修改Project此特定视图中的 —— 为什么需要将关系设置为Project,nHibernate 还不够聪明,无法看到该属性没有改变,也不做任何事情?

于 2011-04-12T23:31:42.643 回答