AutoMapper应该如何访问我的DAL?

时间:2011-04-12 14:34:40

标签: asp.net-mvc fluent-nhibernate automapper loose-coupling

我有一个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)
    )
);

如何根据invoice.Project中的Project属性告诉AutoMapper 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);
}

我发现了一些关于“Resolvers”和ResolveUsing的内容,但我没有使用它的经验。

如何在保留实体模型,输入模型和视图模型之间的松散耦合的同时告诉AutoMapper执行此操作?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

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

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

你还没有修改这个特定视图中的Project - 为什么你需要将关系设置为Project,nHibernate不够智能,看不到属性没有改变,什么都不做?

相关问题