C# 如何将对象Id从DTO映射到数据库中的现有对象?
我正在尝试使用automapper和EF core将对象Id映射到现有对象。 我的dto只接受C# 如何将对象Id从DTO映射到数据库中的现有对象?,c#,asp.net-core,.net-core,entity-framework-core,automapper,C#,Asp.net Core,.net Core,Entity Framework Core,Automapper,我正在尝试使用automapper和EF core将对象Id映射到现有对象。 我的dto只接受LocationId,但如果数据库中存在具有此id的对象,我希望映射WorkRecord实体中的完整Location对象,否则控制器将返回BadRequest DTO: 模型 控制器: [HttpPost] public ActionResult Post(WorkRecordCreateDto workRecordDto) { v
LocationId
,但如果数据库中存在具有此id的对象,我希望映射WorkRecord
实体中的完整Location
对象,否则控制器将返回BadRequest
DTO:
模型
控制器:
[HttpPost]
public ActionResult Post(WorkRecordCreateDto workRecordDto)
{
var workRecord = _mapper.Map<WorkRecord>(workRecordDto);
_repository.GetRepository<WorkRecord>().Add(workRecord);
_repository.SaveChanges();
return Ok();
}
[HttpPost]
公共操作结果发布(WorkRecordCreateDto workRecordDto)
{
var workRecord=\u mapper.Map(workRecordDto);
_repository.GetRepository().Add(工作记录);
_SaveChanges();
返回Ok();
}
我们有一个EnityConverter:
public class EntityConverter<TDestination> : IValueConverter<int, TDestination>
{
private readonly ISession session;
public EntityConverter(ISession session)
{
this.session = session;
}
public TDestination Convert(int sourceMember, ResolutionContext context)
{
return session.Get<TDestination>(sourceMember);
}
}
公共类EntityConverter:IValueConverter
{
专用只读会话;
公共实体转换程序(ISession会话)
{
this.session=会话;
}
public TDestination Convert(int sourceMember,ResolutionContext上下文)
{
返回会话.Get(sourceMember);
}
}
要使用它,您必须配置映射器,使其可以使用DependencyInjection。我们使用Grace,在您的环境中会有所不同:
container.Configure(c => c.ExportFuncWithContext<IMapper>((scope, staticContext, context)
=> new Mapper(automapperConfig, t => scope.Locate(t))).Lifestyle.SingletonPerScope());
container.Configure(c=>c.ExportFuncWithContext((范围、静态上下文、上下文)
=>新的映射程序(automapperConfig,t=>scope.Locate(t)).lifety.SingletonPerScope());
现在,您可以在AutoMapper映射中添加EntityConverter:
CreateMap<WorkRecord, WorkRecordCreateDto>()
.ReverseMap()
.ForMember(d => d.Location, opts => opts.ConvertUsing<EntityConverter<WorkRecord>, int>(src => src.LocationId));
CreateMap()
.ReverseMap()
.ForMember(d=>d.Location,opts=>opts.ConvertUsing(src=>src.LocationId));
container.Configure(c => c.ExportFuncWithContext<IMapper>((scope, staticContext, context)
=> new Mapper(automapperConfig, t => scope.Locate(t))).Lifestyle.SingletonPerScope());
CreateMap<WorkRecord, WorkRecordCreateDto>()
.ReverseMap()
.ForMember(d => d.Location, opts => opts.ConvertUsing<EntityConverter<WorkRecord>, int>(src => src.LocationId));