如果对象为空,如何配置 Automapper 9 以忽略对象属性,但如果不为空,则如何映射
How to configure Automapper 9 to ignore Object-Properties if object is null but map if not null
我已经尝试了很多,但找不到我真正想要的东西。这是我的情况:我有一个带有导航属性和 viewModel 的 EF-Core 实体:
public class SomeEntity
{
public Guid Id { get; set; }
public virtual NestedObject NestedObject { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
}
public class SomeEntityViewModel
{
public Guid Id { get; set; }
public string NestedObjectStringValue { get; set; }
public int NestedValueIntValue { get; set; }
}
这是我的 CreateMap,它创建一个新的 NestedObject,即使没有设置 NestedObject-属性(条件似乎不适用于此处):
CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
.ForPath(m => m.NestedObject.StringValue, opt =>
{
opt.Condition(s => s.Destination.NestedObject != null);
opt.MapFrom(m => m.NestedObjectStringValue);
});
如果属性为空,这将避免创建新的 NestedObject,但如果不是,则不会映射 NestedObject 属性:
CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
.ForMember(m => m.NestedObject, opt => opt.AllowNull());
如果设置了 NestedObject 属性,第二个 CreateMap 不会映射它们,如果未设置属性,则首先创建一个新的 NestedObject。但是两者都不起作用。有什么解决办法吗?
删除 ReverseMap()
,然后尝试使用 AutoMapper Conditional Mapping 并使用 ForPath
而不是 ForMember
嵌套子对象属性:
CreateMap<SomeEntityViewModel, SomeEntity>()
.ForPath(
m => m.NestedObject.StringValue,
opt => {
opt.Condition(
s => s.DestinationMember != null && s.DestinationMember != ""
);
opt.MapFrom(s => s.NestedObjectStringValue);
}
);
同IntValue
。
更新
因此,如果 NestedObject
为空,您不想将 SomeEntityViewModel
中的值映射到它。如果 NestedObject
不为空,则映射有效。
请参考下面使用AfterMap
的代码
CreateMap<SomeEntityViewModel, SomeEntity>()
.ForMember(q => q.NestedObject, option => option.Ignore())
.AfterMap((src, dst) => {
if(dst.NestedObject != null)
{
dst.NestedObject.StringValue = src.NestedObjectStringValue;
}
});
我已经尝试了很多,但找不到我真正想要的东西。这是我的情况:我有一个带有导航属性和 viewModel 的 EF-Core 实体:
public class SomeEntity
{
public Guid Id { get; set; }
public virtual NestedObject NestedObject { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
}
public class SomeEntityViewModel
{
public Guid Id { get; set; }
public string NestedObjectStringValue { get; set; }
public int NestedValueIntValue { get; set; }
}
这是我的 CreateMap,它创建一个新的 NestedObject,即使没有设置 NestedObject-属性(条件似乎不适用于此处):
CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
.ForPath(m => m.NestedObject.StringValue, opt =>
{
opt.Condition(s => s.Destination.NestedObject != null);
opt.MapFrom(m => m.NestedObjectStringValue);
});
如果属性为空,这将避免创建新的 NestedObject,但如果不是,则不会映射 NestedObject 属性:
CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
.ForMember(m => m.NestedObject, opt => opt.AllowNull());
如果设置了 NestedObject 属性,第二个 CreateMap 不会映射它们,如果未设置属性,则首先创建一个新的 NestedObject。但是两者都不起作用。有什么解决办法吗?
删除 ReverseMap()
,然后尝试使用 AutoMapper Conditional Mapping 并使用 ForPath
而不是 ForMember
嵌套子对象属性:
CreateMap<SomeEntityViewModel, SomeEntity>()
.ForPath(
m => m.NestedObject.StringValue,
opt => {
opt.Condition(
s => s.DestinationMember != null && s.DestinationMember != ""
);
opt.MapFrom(s => s.NestedObjectStringValue);
}
);
同IntValue
。
更新
因此,如果 NestedObject
为空,您不想将 SomeEntityViewModel
中的值映射到它。如果 NestedObject
不为空,则映射有效。
请参考下面使用AfterMap
CreateMap<SomeEntityViewModel, SomeEntity>()
.ForMember(q => q.NestedObject, option => option.Ignore())
.AfterMap((src, dst) => {
if(dst.NestedObject != null)
{
dst.NestedObject.StringValue = src.NestedObjectStringValue;
}
});