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
对于existingStratusVendorContact
您将使用Map()
方法返回的变量的当前值替换,无论您忽略哪些属性。
使用Mapper.Map(source)
您可以根据某些约定将对象投影到其他类型复制属性的新对象,但是您要创建一个新对象。
在您的代码中,您将使用其默认值创建具有Id
, CreatedById
和CreatedOn
属性的新对象。
您可以使用完全符合您要求的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
,则使用默认行为并映射属性。