AutoMapper ForMember忽略不起作用

时间:2016-03-03 22:48:13

标签: c# automapper

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

cfg.CreateMap<VendorContact, VendorContact>()
    .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>(vendorContact);

看见this other answer,但看来我已经这样做了。

更新:

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

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

});

2 个答案:

答案 0 :(得分:3)

您的问题是您没有给予现代对象自动播放器。 Automapper绝对可以做到这一点。

Mapper.Map<VendorContact>(vendorContact, existingStratusVendorContact);

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

答案 1 :(得分:1)

<强>更新

问题在于,当您将Mapper.Map<VendorContact>(vendorContact);分配给existingStratusVendorContact时,无论您忽略哪些属性,都要使用Map()方法返回变量的当前值。

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

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

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

Mapper.Map<VendorContact>(vendorContact, existingStratusVendorContact);

<强> ORIGINAL:

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

var cfg = new MapperConfiguration(c =>
{
    c.CreateMap<VendorContact, VendorContact>()
        .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>(vendorContact);

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