我想知道,我怎么能用AutoMapper将一个Dto映射到多个实体。
Lemme解释。
我有一个Dto,用枚举来描述它的类型(避免有多个dtos)
根据枚举(这里是RelationType),我想将它映射到正确的模型(实体,它是我在数据库中使用的另一个对象)。
public class BCardDto : IMappedDto
{
public long Id { get; set; }
public BCardRelationType RelationType { get; set; }
public long RelationId { get; set; }
}
以下是我的模型库:
public class BCardModel : IMappedDto
{
public long Id { get; set; }
}
这里是派生的模型:
public class CardBCardModel : BCardModel
{
// ormlite, ignore that
[Reference]
public CardModel Card { get; set; }
[ForeignKey(typeof(CardModel), ForeignKeyName = "fk_bcard_card")]
public long RelationId { get; set; }
}
如何根据我给出的枚举将Dto映射到正确的模型? (我不想在任何地方使用Mapper.Map,但我想让mapper做运行时映射工作)
以下是我为模型做的方法 - > DTO
cfg.CreateMap<CardBCardModel, BCardDto>()
.ForMember(s => s.RelationType, expression => expression.UseValue(BCardRelationType.Card))
.IncludeBase<BCardModel, BCardDto>();
告诉我,如果我做错了,请解释为什么请:)
先谢谢了, Blowa。
答案 0 :(得分:1)
假设您有一个设置,其中有一个基类和两个派生基类的类:
public class ModelBase
{
public string Name { get; set; }
}
public class ModelOne : ModelBase { }
public class ModelTwo : ModelBase { }
我们还说你有一个带有枚举的DTO如下:
public class ModelDto
{
public string Name { get; set; }
public ModelType ModelType { get; set; }
}
public enum ModelType
{
One = 1,
Two = 2
}
现在任务是:如何将ModelDto
映射到ModelOne
或ModelTwo
,具体取决于ModelDto.ModelType
属性中的值?
以下是:
Mapper.Initialize(cfg => cfg.CreateMap<ModelDto, ModelBase>().ConstructUsing(x =>
{
switch (x.ModelType)
{
case ModelType.One:
return new ModelOne { Name = x.Name };
case ModelType.Two:
return new ModelTwo { Name = x.Name };
default:
throw new InvalidOperationException("Unknown ModelType...");
}
}));
<强>用法强>
var dto1 = new ModelDto { ModelType = ModelType.One, Name = "ModelOne" };
var dto2 = new ModelDto { ModelType = ModelType.Two, Name = "ModelTwo" };
var one = Mapper.Map<ModelBase>(dto1);
var two = Mapper.Map<ModelBase>(dto2);
答案 1 :(得分:0)
进行映射的另一种方法是使用动态:
public class PersonDto
{
public string Name { get; set; }
}
public class StudentDto : PersonDto
{
public int studentNumber { get; set; }
}
public class EmployeDto : PersonDto
{
public string EmployeId { get; set; }
}
public class Person
{
public string Name { get; set; }
}
public class Student : Person
{
public int StudentNumber { get; set; }
}
public class Employe : Person
{
public string EmployeId { get; set; }
}
使用以下方法创建地图:
Mapper.CreateMap<StudentDto, Student>();
Mapper.CreateMap<EmployeDto, Employe>();
通过以下方式进行映射
try
{
var student = MapPerson((dynamic) studentDto);
var employe = MapPerson((dynamic) employeDto);
}
catch
{
throw new InvalidOperationException("Unknown ModelType...");
}
并定义两个方法
public static Student MapPerson(StudentDto studentDto)
{
return Mapper.Map<StudentDto, Student>(studentDto);
}
public static Employe MapPerson(EmployeDto employeDto)
{
return Mapper.Map<EmployeDto, Employe>(employeDto);
}
好处是您不需要键,并且避免使用switch语句