【问题标题】:How to retrieve an Entity when using AutoMapper使用 AutoMapper 时如何检索实体
【发布时间】:2012-09-29 20:59:19
【问题描述】:

我使用 AutoMapper 在 Asp.net 中使用 MVC。

从这段代码可以看出

 Event eventObj = Mapper.Map<EventEditViewModel, Event>(eventEditViewModel);

我正在尝试将地图 EventEditViewModel 转换为事件。

我需要使用我的服务层将 CandidateId 转换为实际的实体。

知道是否可以在 AutoMapper 中执行此操作?如何设置它

公共类事件() { 公共类候选人{get;放;} }

public class EventEditViewModel()
{
    public string CandidateId {get; set;}
}

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 automapper automapper-2


    【解决方案1】:

    您应该避免使用 AutoMapper 从服务层检索实体。理想情况下,它应该用于直接在给定类型的属性之间进行映射。

    【讨论】:

    • 我大体上同意,但是,为什么不呢?它“感觉不对”,但有时您需要从 DTO 转到实体,因此您需要从数据库中加载一些内容。有没有更好的方法? I asked something similar here.
    【解决方案2】:

    有时这可能很有用,但是我尝试仅在我的服务层中使用 Automapper(也就是服务的所有输入和输出都是特殊的输入和输出模型):

    Mapper.CreateMap<int, Entity>().ConvertUsing( new RepoTypeConverter<Entity>() );
    
    public class NullableRepoTypeConverter<T> : ITypeConverter<int, T>
    {
        public T Convert( ResolutionContext context )
        {
            int? src = (int?)context.SourceValue;
            if (src != null && src.HasValue) {
                return Repository.Load<T>( src.Value );
            } else {
                return default(T);
            }
        }
    
        // Get Repository somehow (like injection)
        private IRepository repository;
        public IRepository Repository
        {
            get
            {
                if (repository == null) {
                    repository = KernelContainer.Kernel.Get<IRepository>();
                }
                return repository;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      我认为您需要先创建一个地图,如下所示:

      Mapper.CreateMap<EventEditViewModel, Event>();
      

      在你使用它之前。

      【讨论】:

      • 感谢彼得,映射器已配置 :-)
      • @GibboK 很好,没问题 - 你想接受那个答案吗 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2010-12-06
      相关资源
      最近更新 更多