【发布时间】:2019-12-12 12:51:18
【问题描述】:
我有带有自动映射器的 .net core 3.0 api。
我的映射遇到了一个问题。下面我列出了我的实体。
[Table(name: "ChannelType")]
public class ChannelType : FullAuditedEntity<string>
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
[StringLength(06)]
public override string Id { get; set; }
public string Text { get; set; }
public virtual ChannelTypeT ChannelTypeT { get; set; }
}
ChannelTypeT 实体会是这样的。
[Table(name: "ChannelTypeT")]
public class ChannelTypeT
{
[StringLength(02)]
public string Lang { get; set; }
public string Text { get; set; }
#region Primary Key derived from Foreign key for Config tabels
[Required]
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[ForeignKey(name: "ChannelTypeId")]
public string ChannelTypeId { get; set; }
public virtual ChannelType ChannelType { get; set; }
#endregion
}
现在,这意味着当我插入一个 ChannelType 时,代码也应该在 ChannelTypeT 中插入一条新记录,其 Id 与 ChannelTypeId 相同。这是快照。
这是我的 Dto 类。
public class ChannelTypeDtoIncluding
{
public string Id { get; set; }
public string Text { get; set; }
public virtual ChannelTypeTDto ChannelTypeT { get; set; }
}
public class ChannelTypeTDto
{
public string ChannelTypeId { get; set; }
public string Lang { get; set; }
public string Text { get; set; }
}
我的自动映射器映射。
CreateMap<ChannelTypeT, ChannelTypeTDto>().ReverseMap();
CreateMap<ChannelType, ChannelTypeDtoIncluding>()
.ForMember(d => d.Id, opt => opt.MapFrom(s => s.ChannelTypeT.ChannelTypeId))
.ForMember(d => d.Id, opt => opt.MapFrom(s => s.ChannelTypeT.Id))
.ReverseMap();
最后这是我的 post 方法。
[HttpPost("InsertIncluding")]
public IActionResult PostIncluding([FromBody]ChannelTypeDtoIncluding model)
{
if (string.IsNullOrEmpty(model.Id))
return new NotFoundResult();
if (!ModelState.IsValid)
return BadRequest(ModelState);
Response<ChannelType> itemToReturn = _service.Insert(_mapper.Map<ChannelTypeDtoIncluding, ChannelType>(source: model));
if (itemToReturn.IsSuccess == true)
return new OkObjectResult(_mapper.Map<ChannelType, ChannelTypeDtoIncluding>(source: itemToReturn.Data));
else
return new ObjectResult(itemToReturn.ErrorMessage) { StatusCode = 500 };
}
但是在这种方法中,当我尝试映射我的模型时,它给了我错误。以下是错误描述。
找不到实体类型“ChannelTypeT”的属性“Id”。确保该属性存在并且已包含在模型中。
我的映射器会将 ChannelType -> Id 更新为 ChannelTypeT -> ChannelTypeId。 我认为问题出在映射器配置上,但不确定我在哪里做错了。
对此的任何想法都会有很大帮助。
【问题讨论】:
-
请在您使用自动映射器映射实体的位置添加代码
-
我也用过 Dto。所以它会给这里的读者带来更多的困惑。所以我选择不添加它们。
-
抱歉,我不明白您想将哪 2 个实体映射到需要将
ChannelType.Id映射到ChannelTypeT.ChannelTypeId的位置。你在mapper.Map<ChannelType, ChannelTypeT>()吗? -
是的。我需要的结果是
ChannelType.Id到ChannelTypeT.ChannelTypeId的映射。正如你所说,我也在为此做一个映射。
标签: c# asp.net-core automapper ef-core-3.0