【发布时间】:2019-03-14 19:22:41
【问题描述】:
我目前在我的 .net core (2.1) api 项目中使用 Automapper (8.0.0)。下面是我的代码示例,用于模拟我的 dto 映射到我的数据库对象的更新过程。我希望自动映射器忽略 Dto 中空对象的映射。
using AutoMapper;
using System;
namespace testAutoMapper
{
public class SourceObject
{
public bool TestReverseFalse { get; set; }
public bool TestReverseTrue { get; set; }
public bool IFalse { get; set; }
public bool ITrue { get; set; }
public int TestInteger { get; set; }
public int TestNullInteger { get; set; }
}
public class ModelObject
{
public bool? TestReverseFalse { get; set; }
public bool? TestReverseTrue { get; set; }
public bool? IFalse { get; set; }
public bool? ITrue { get; set; }
public int? TestInteger { get; set; }
public int? TestNullInteger { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
AutoMapper.Mapper.Initialize(mapper =>
{
//global ignore for all
//mapper.ForAllMaps((tm, me) => me.ForAllMembers(option => option.Condition((src, destination, sourceMember) => sourceMember != null)));
mapper.CreateMap<ModelObject, SourceObject>().ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
});
var model = new ModelObject
{
TestReverseFalse = true,
TestReverseTrue = false,
};
var source = new SourceObject
{
TestReverseFalse = false,
TestReverseTrue = true,
ITrue = true,
IFalse = false,
TestInteger = 100,
TestNullInteger = 100
};
Console.WriteLine("Source Before Mapping");
Console.WriteLine("TestReverseFalse: " + source.TestReverseFalse);
Console.WriteLine("TestReverseTrue: " + source.TestReverseTrue);
Console.WriteLine("ITrue:" + source.ITrue);
Console.WriteLine("IFalse:" + source.IFalse);
Console.WriteLine("TestInteger:" + source.TestInteger);
Console.WriteLine("TestNullInteger:" + source.TestNullInteger);
Mapper.Map(model, source);
Console.WriteLine();
Console.WriteLine("After Mapping");
Console.WriteLine("TestReverseFalse: " + source.TestReverseFalse);
Console.WriteLine("TestReverseTrue: " + source.TestReverseTrue);
Console.WriteLine("ITrue:" + source.ITrue);
Console.WriteLine("IFalse:" + source.IFalse);
Console.WriteLine("TestInteger:" + source.TestInteger);
Console.WriteLine("TestNullInteger:" + source.TestNullInteger);
Console.ReadLine();
}
}
}
样本输出
Source Before Mapping
TestReverseFalse: False
TestReverseTrue: True
ITrue:True
IFalse:False
TestInteger:100
TestNullInteger:100
After Mapping
TestReverseFalse: True
TestReverseTrue: False
ITrue:False
IFalse:False
TestInteger:0
TestNullInteger:0
我发现我的源对象被重置为其默认值。 不知道我做错了哪一部分。
【问题讨论】:
-
你有没有试过像这里一样使用 IgnoreNullResolver stackoverflow.com/a/44986528/4353251
-
谢谢@LorenzoIsidori 该解决方案似乎不适用于版本8。我还参考了github.com/AutoMapper/AutoMapper/issues/…
标签: .net-core automapper