AutoMapper ForMember忽略不起作用

在MVC应用程序中执行相同实体类型的副本,但希望忽略复制主键(对现有实体进行更新)。 但是,在下面的地图中将Id列设置为忽略不起作用,并且正在覆盖Id。

cfg.CreateMap() .ForMember(dest => dest.Id, option => option.Ignore()) .ForMember(dest => dest.CreatedById, option => option.Ignore()) .ForMember(dest => dest.CreatedOn, option => option.Ignore()) ; 

执行地图:

 existingStratusVendorContact = Mapper.Map(vendorContact); 

看到其他答案 ,但看来我已经这样做了。

更新:

Fyi,我在Global.asax中创建我的地图,如下所示:

 Mapper.Initialize(cfg => { cfg.CreateMap() .ForMember(dest => dest.Id, option => option.Ignore()) .ForMember(dest => dest.CreatedById, option => option.Ignore()) .ForMember(dest => dest.CreatedOn, option => option.Ignore()) ; }); 

您的问题是您没有给予现代对象automapper。 Automapper绝对可以做到这一点。

 Mapper.Map(vendorContact, existingStratusVendorContact); 

应该做你想要的。 您当前的代码正在创建一个全新的对象,并将existingStratusVendorContact替换为全新的对象。 上面的代码将按照您的预期获取现有对象和更新值。

更新:

问题是当您分配Mapper.Map(vendorContact); 对于existingStratusVendorContact您将使用Map()方法返回的变量的当前值替换,无论您忽略哪些属性。

使用Mapper.Map(source)您可以根据某些约定将对象投影到其他类型复制属性的新对象,但是您要创建一个新对象。

在您的代码中,您将使用其默认值创建具有IdCreatedByIdCreatedOn属性的新对象。

您可以使用完全符合您要求的Mapper.Map(source, destination)重载:

 Mapper.Map(vendorContact, existingStratusVendorContact); 

原版的:

如果您要创建这样的地图:

 var cfg = new MapperConfiguration(c => { c.CreateMap() .ForMember(dest => dest.Id, option => option.Ignore()) .ForMember(dest => dest.CreatedById, option => option.Ignore()) .ForMember(dest => dest.CreatedOn, option => option.Ignore()); }); 

您需要使用此配置创建映射器:

 var mapper = cfg.CreateMapper(); 

并使用它来映射对象:

 var existingStratusVendorContact = mapper.Map(vendorContact); 

如果使用静态类Mapper ,则使用默认行为并映射属性。