C# 自动映射和日期时间到字符串的映射不工作

C# 自动映射和日期时间到字符串的映射不工作,c#,automapper,automapper-3,C#,Automapper,Automapper 3,我已经和AutoMapper打了几天交道,但我最难的是映射我认为是基本任务的值。我很可能是个愚蠢的人,但随着这些不断抛出的异常,我开始感到非常沮丧/咆哮 无论如何,我有一个实体框架代理对象公司。通过基类实体它有一个名为CreatedDateTime的属性,它是一个DateTime。我还有一个名为CompanyDto的DTO对象,它有一个名为CreatedDateTime的属性,它是一个字符串。我所要做的就是获取DateTime值并将其展平到ToString(“g”)。我试过很多方法,都会抛出某种

我已经和AutoMapper打了几天交道,但我最难的是映射我认为是基本任务的值。我很可能是个愚蠢的人,但随着这些不断抛出的异常,我开始感到非常沮丧/咆哮

无论如何,我有一个实体框架代理对象
公司
。通过基类
实体
它有一个名为
CreatedDateTime
的属性,它是一个
DateTime
。我还有一个名为
CompanyDto
的DTO对象,它有一个名为
CreatedDateTime
的属性,它是一个
字符串。我所要做的就是获取
DateTime
值并将其展平到
ToString(“g”)
。我试过很多方法,都会抛出某种异常。唯一有效的映射是,惊奇,惊奇:
.Ignore()
。下面是我最新的TypeConverter尝试:

Mapper.CreateMap<DateTime, string>().ConvertUsing<DateTimeToStringConverter>();

public sealed class DateTimeToStringConverter : TypeConverter<DateTime, string> {
    protected override string ConvertCore(
        DateTime source) {
        if (source != null) {
            return source.ToString("g");
        }

        return string.Empty;
    }
}
Mapper.CreateMap().ConvertUsing();
公共密封类DateTimeToString转换器:TypeConverter{
受保护重写字符串转换核心(
日期时间(源){
如果(源!=null){
返回源.ToString(“g”);
}
返回字符串。空;
}
}
这导致:类型“System.String”没有默认构造函数

吉米,你这么说?请给我指出正确的方向,因为在这一点上,我认为我将通过手动映射比使用AutoMapper完成更多的工作


哦,这是AutoMapper 3.1.1、Entity Framework 6.1、ASP.NET MVC 5.1.1为那些想知道的人准备的。

试试这个,而不是定制转换器

Mapper.CreateMap<Company, CompanyDto>()
      .ForMember(d => d.CreatedDateTime,
        expression => expression.ResolveUsing(s=>s.CreatedDateTime.ToString("g")));

// now do the Mapper.Map from Company to CompanyDto.
Mapper.CreateMap()
.ForMember(d=>d.CreatedDateTime,
expression=>expression.resolvesusing(s=>s.CreatedDateTime.ToString(“g”));
//现在执行Mapper.Map从一个公司映射到另一个公司。

您也可以简单地使用
MapFrom
方法,而不是
resolvesusing

public class EFObject
{
    public DateTime D { get; set; }
}
public class DTOObject
{
    public string DS { get; set; }
}

internal class Program
{
    private static void Main(string[] args)
    {
        Mapper.CreateMap<EFObject, DTOObject>().
            ForMember(dtoo => dtoo.DS, opt => opt.MapFrom(efo => efo.D.ToString("g")));

        var fromDB = new EFObject() { D = DateTime.Now };
        var toDTO = Mapper.Map<EFObject, DTOObject>(fromDB);
    }
}
公共类eObject
{
公共日期时间D{get;set;}
}
公共类数据对象
{
公共字符串DS{get;set;}
}
内部课程计划
{
私有静态void Main(字符串[]args)
{
Mapper.CreateMap()。
ForMember(dtoo=>dtoo.DS,opt=>opt.MapFrom(efo=>efo.D.ToString(“g”));
var fromDB=new EFObject(){D=DateTime.Now};
var toDTO=Mapper.Map(fromDB);
}
}

我建议使用
MapFrom
而不是
ResolveUsing
,因为
MapFrom
会沿解析路径添加一些空检查(除其他外)。这里是

尝试过的,现在我得到:对象引用未设置为对象的实例。我知道这个属性有一个值,因为它在数据库中不能为null。你能粘贴完整的代码和异常的堆栈跟踪吗?数据库没有区别。重要的是类型在代码中是否可以为null。此外,请放置断点并检查CompanyObject.CreatedDateTime值的值。(假设有空引用)我保证值不是空的。在调试最新的异常时,我注意到内部异常是:程序集中存在重复的类型名。;它不知何故来自
DbContext
,仅在
公司
集合上。我看到数据库中的数据,它不是空的,所以Idk给出了什么。老实说,我现在只打算手动绘制地图,将来可能会再次访问AutoMapper。我只是受够了AutoMapper和我在应用程序中不断遇到的所有奇怪情况。我会接受你的回答,因为我认为你是正确的,以防将来有人发现这一点。+1使用MapFrom。在我的例子中,我使用了MapFrom的Func参数,在这里我必须显式地从一个日期列映射到另一个日期列(在列表中)