0

我在 ViewModels 中使用int?所有我需要的“FK”属性。这为我提供了一种简单的方法,可以在 Create 视图模型上指定一个值可以为空,并且必须为其分配一个值以满足该Required属性。

我的问题出现了,因为我首先使用域工厂创建域模型实体,然后将其映射到视图模型。现在,视图模型中的许多可为空的整数从域模型中的不可为空的整数中被赋值为 0。我宁愿不在视图模型中构建新实体,而只将其映射回域模型以避免他的。我还可以做些什么?我确定有 som Automapper voodoo 可以帮助我。

4

2 回答 2

2

编辑:你不需要做任何这些,但我想我会把它留在这里给寻找类似解决方案的人。实际上,您所要做的就是提供一个从intint?这样的映射:Mapper.Map<int, int?>()

在这种情况下,我相信您可以使用继承自自动映射器 ITypeConverter 的自定义类型转换器。此代码有效,我已通过 .NET Fiddle 运行它:

using System;
using AutoMapper;

public class Program
{
    public void Main()
    {
        CreateMappings();
        var vm = Mapper.Map<MyThingWithInt, MyThingWithNullInt>(new MyThingWithInt());

        if (vm.intProp.HasValue)
        {
            Console.WriteLine("Value is not NULL!");

        }
        else
        {
            Console.WriteLine("Value is NULL!");
        }
    }

    public void CreateMappings() 
    {
        Mapper.CreateMap<int, int?>().ConvertUsing(new ZeroToNullIntTypeConverter ());
        Mapper.CreateMap<MyThingWithInt, MyThingWithNullInt>();
    }


    public class ZeroToNullIntTypeConverter : ITypeConverter<int, int?>
    {
        public int? Convert(ResolutionContext ctx)
        {
           if((int)ctx.SourceValue == 0)
           {
              return null;
           }
            else
           {
               return (int)ctx.SourceValue;
           }
        }
    }

    public class MyThingWithInt
    {
        public int intProp = 0; 
    }

    public class MyThingWithNullInt
    {
        public int? intProp {get;set;}  
    }
}
于 2014-01-29T23:07:29.467 回答
0

您始终可以.ForMember()在映射上使用该方法。像这样的东西:

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.MyNullableIntProperty,
        opt => opt.MapFrom(src => 0)
    );
于 2014-01-28T00:34:55.643 回答