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