在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())
;
});
答案 0 :(得分:3)
您的问题是您没有给予现代对象自动播放器。 Automapper绝对可以做到这一点。
Mapper.Map<VendorContact>(vendorContact, existingStratusVendorContact);
应该做你想做的事。您当前的代码正在创建一个全新的对象,并将existingStratusVendorContact
替换为全新的对象。上面的代码将按预期采用现有对象和更新值。
答案 1 :(得分:1)
<强>更新强>
问题在于,当您将Mapper.Map<VendorContact>(vendorContact);
分配给existingStratusVendorContact
时,无论您忽略哪些属性,都要使用Map()
方法返回变量的当前值。
使用Mapper.Map(source)
,您可以根据某些约定将对象投影到其他类型复制属性的新对象,但是您要创建一个新对象。
在您的代码中,您正在使用Id
,CreatedById
和CreatedOn
属性创建一个具有默认值的新对象。
您可以使用符合您要求的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
,则使用默认行为并映射属性。