使用AutoMapper将Viewmodel映射到模型

时间:2019-02-28 18:49:57

标签: c# .net automapper

我在asp.net api中编写了一个控制器方法,该方法将返回一个称为AllocationsViewModel的视图模型。 GetAllocationsViewModel包含另外三个视图模型的子集。 GetAllocationsGrouped当前返回FIRMWIDE_MANAGER_ALLOCATION,而我需要返回此FirmWideAllocationsViewModel。我已经安装了Automapper 8.0,并添加了一些代码来进行映射。这足以胜任这项工作。我只能看到通过这些值传入的ManagerStrategyID和ManagerStrategyID值的字段均为空。我已经运行了原始查询,并且可以看到所有字段都有值

 public class FIRMWIDE_MANAGER_ALLOCATION 
    {
        private decimal _groupPercent;
        public int FIRM_ID { get; set; }        
        public string FIRM_NAME { get; set; }
        public int? MANAGER_STRATEGY_ID { get; set; }
        public int? MANAGER_FUND_ID { get; set; }
        public int MANAGER_ACCOUNTING_CLASS_ID { get; set; }
        public int? MANAGER_FUND_OR_CLASS_ID { get; set; }
        public string MANAGER_FUND_NAME { get; set; }
        public string MANAGER_ACCOUNTING_CLASS_NAME { get; set; }
        public string MANAGER_STRATEGY_NAME { get; set; }
        public int? PRODUCT_ID { get; set; }
        public string PRODUCT_NAME { get; set; }

        public int? QUANTITY { get; set; }
        public decimal? NAV { get; set; }

    }



 public class FirmWideAllocationsViewModel
    {
        private decimal _groupPercent;
        public int FirmID { get; set; }
        public string FirmName { get; set; }
        public int? ManagerStrategyID { get; set; }
        public int? ManagerFundID { get; set; }
        public int ManagerAccountClassID{ get; set; }
        public int? ManagerFundOrClassID { get; set; }
        public string ManagerFundName { get; set; }
        public string ManagerAccountingClassName { get; set; }
        public string ManagerStrategyName { get; set; }
        public int? ProductID { get; set; }
        public string ProductName { get; set; }

        public int? Quantity { get; set; }
        public decimal? Nav { get; set; }

   }

    public IHttpActionResult Details(int id, DateTime date)
        {

            var viewModel = GetAllocationsViewModel(id, date);
            if (viewModel == null) return NotFound(); 
            return Ok(viewModel);
        }


    private AllocationsViewModel GetAllocationsViewModel(int id, DateTime date)
        {

            var ms = GetStrategy(id);

            DateTime d = new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1);
            if (ms.FIRM_ID != null)
            {
                var firm = GetService<FIRM>().Get(ms.FIRM_ID.Value);
                var currentEntity = new EntityAllocationsViewModel(new EntityViewModel { EntityId = firm.ID, EntityName = firm.NAME, EntityType = EntityType.Firm });
                 var allocationsGrouped = Mapper.Map<List<FIRMWIDE_MANAGER_ALLOCATION>, List<FirmWideAllocationsViewModel>>(GetAllocationsGrouped(EntityType.ManagerStrategy, id, d).ToList());
                var missingProducts = GetMissingProducts();

                var vm = new AllocationsViewModel
                {
                    CurrentEntity = currentEntity,
                    ManagerAllocations = allocationsGrouped,
                    MissingProducts = missingProducts
                };

                return vm;
            }

            return null;
        }


public class AllocationsViewModel
{
    public EntityAllocationsViewModel CurrentEntity { get; set; }
    public List<FirmWideAllocationsViewModel> ManagerAllocations { get; set; }
    public object MissingProducts { get; set; }


}

我在安装autommapper 8.0后添加了以下代码

     public class AutoMapperConfig 
        {
            public static void Initialize()
            {
                Mapper.Initialize((config) =>
                {

                config.ReplaceMemberName("FIRM_ID", "FirmID");
                config.ReplaceMemberName("FIRM_NAME", "FirmName");
                config.ReplaceMemberName("MANAGER_STRATEGY_ID", "ManagerStrategyID");
                config.ReplaceMemberName("MANAGER_FUND_ID", "ManagerFundID");
                config.ReplaceMemberName("MANAGER_ACCOUNTING_CLASS_ID", "ManagerAccountClassID");
                config.ReplaceMemberName("MANAGER_FUND_OR_CLASS_ID", "ManagerFundOrClassID");
                config.ReplaceMemberName("MANAGER_FUND_NAME", "ManagerFundName");
                config.ReplaceMemberName("MANAGER_ACCOUNTING_CLASS_NAME", "ManagerAccountingClassName");

                config.ReplaceMemberName("MANAGER_STRATEGY_NAME", "ManagerStrategyName");
                config.ReplaceMemberName("PRODUCT_ID", "ProductID");
                config.ReplaceMemberName("PRODUCT_NAME", "ProductName");
                config.ReplaceMemberName("QUANTITY", "Quantity");
                config.ReplaceMemberName("NAV", "Nav");


 config.CreateMap<FIRMWIDE_MANAGER_ALLOCATION, FirmWideAllocationsViewModel>().ReverseMap();
                });
            }
        }


          protected void Application_Start()
            {

                AutoMapperConfig.Initialize();
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }       

1 个答案:

答案 0 :(得分:0)

问题已解决。我必须修改分组声明,以包括所有字段。之前它运行良好,但是随着最新实体框架的升级,我认为情况确实如此

allocations = allocations.GroupBy(x => new { x.MANAGER_STRATEGY_ID, x.PRODUCT_ID, x.EVAL_DATE })
                    .Select(group => new FIRMWIDE_MANAGER_ALLOCATION {  EVAL_DATE = group.First().EVAL_DATE,
                                                                        FIRM_ID = group.First().FIRM_ID,
                                                                        FIRM_NAME = group.First().FIRM_NAME,
                                                                        MANAGER_ACCOUNTING_CLASS_ID = group.First().MANAGER_ACCOUNTING_CLASS_ID,
                                                                        MANAGER_ACCOUNTING_CLASS_NAME = group.First().MANAGER_ACCOUNTING_CLASS_NAME,
                                                                        MANAGER_FUND_ID = group.First().MANAGER_FUND_ID,
                                                                        MANAGER_FUND_NAME = group.First().MANAGER_FUND_NAME,
                                                                        MANAGER_FUND_OR_CLASS_ID = group.First().MANAGER_FUND_OR_CLASS_ID,
                                                                        NAV = group.First().NAV,
                                                                        Percent = group.First().Percent,
                                                                        MANAGER_STRATEGY_ID = group.First().MANAGER_STRATEGY_ID,
                                                                        EMV = group.Sum(x => x.EMV),
                                                                        USD_EMV = group.Sum(x => x.USD_EMV),
                                                                        MANAGER_STRATEGY_NAME = group.First().MANAGER_STRATEGY_NAME,
                                                                        PRODUCT_ID = group.First().PRODUCT_ID,
                                                                        PRODUCT_NAME = group.First().PRODUCT_NAME })
                    .ToList();