Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将对象Id从DTO映射到数据库中的现有对象?_C#_Asp.net Core_.net Core_Entity Framework Core_Automapper - Fatal编程技术网

C# 如何将对象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

我正在尝试使用automapper和EF core将对象Id映射到现有对象。 我的dto只接受
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));