实体
public class PurchaseReq
{
...
public string PrNumber { get; set; } // primary key
public List<PurchaseReqItem> PurchaseReqItems { get; init; } = [];
public List<PurchaseReqCharge> PurchaseReqCharges { get; init; } = [];
}
public class PurchaseReqItem
{
...
public int Id { get; init; } // primary key
public string PrNumber { get; set; } // foreign key
public PurchaseReq PurchaseReq { get; init; } //navigation property
}
public class PurchaseReqCharge
{
...
public int Id { get; init; } // primary key
public string PrNumber { get; set; } // foreign key
public PurchaseReq PurchaseReq { get; init; } //navigation property
}
Dtos
public class PurchaseReqDto
{
...
public string PrNumber { get; set; }
public List<PurchaseReqItemDto> PurchaseReqItems { get; init; } = [];
public List<PurchaseReqChargeDto> PurchaseReqCharges { get; init; } = [];
}
public class PurchaseReqItemDto
{
...
public int Id { get; init; }
public string PrNumber { get; set; }
public PurchaseReqDto PurchaseReq { get; init; }
}
public class PurchaseReqChargeDto
{
...
public int Id { get; init; }
public string PrNumber { get; set; }
public PurchaseReqDto PurchaseReq { get; init; }
}
映射配置文件
public class PurchaseReqProfile : Profile
{
public PurchaseReqProfile()
{
CreateMap<PurchaseReq, PurchaseReqDto>();
CreateMap<PurchaseReqDto, PurchaseReq>()
.ForMember(d => d.PurchaseReqItems, o => o.MapFrom(src => src.PurchaseReqItems))
.ForMember(d => d.PurchaseReqCharges, o => o.MapFrom(src => src.PurchaseReqCharges));
}
}
public class PurchaseReqItemProfile : Profile
{
public PurchaseReqItemProfile()
{
CreateMap<PurchaseReqItem, PurchaseReqItemDto>();
CreateMap<PurchaseReqItemDto, PurchaseReqItem>()
.ForMember(d => d.TaxRate, o => o.Ignore());
}
}
public class PurchaseReqChargeProfile : Profile
{
public PurchaseReqChargeProfile()
{
CreateMap<PurchaseReqCharge, PurchaseReqChargeDto>();
CreateMap<PurchaseReqChargeDto, PurchaseReqCharge>()
.ForMember(d => d.OtherCharge, o => o.Ignore());
}
}
AutoMapper添加到服务Program.cs
AutoMapper版本13.0.1
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
取PurchaseReqRepo
的数据
public async Task<PurchaseReq> GetPrForUpdateAsync(string prNumber)
{
ArgumentNullException.ThrowIfNull(prNumber);
return await context.PurchaseReqs
.Include(pr => pr.PurchaseReqItems)
.Include(pr => pr.PurchaseReqCharges)
.SingleOrDefaultAsync(pr => pr.PrNumber == prNumber);
}
更新 API
[HttpPut]
[CanUserUpdate(RolesConstant.PurchaseReq)]
public async Task<IActionResult> UpdatePurchaseReq([FromBody] PurchaseReqDto purchaseReqDto)
{
if (!short.TryParse(User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value,out var userId))
return Unauthorized();
var purchaseReq = await purchaseReqRepo.GetPrForUpdateAsync(purchaseReqDto.PrNumber);
if (purchaseReq == null)
return NotFound();
if (purchaseReq.IsSubmitted)
return BadRequest(string.Format($"PR ({purchaseReq.PrNumber}) was already submitted for approval and can't be updated."));
mapper.Map(purchaseReqDto, purchaseReq, options =>
options.BeforeMap((prDto, pr) =>
{
pr.RemoveUnMatchedItems(prDto.PurchaseReqItems);
pr.RemoveUnMatchedCharges(prDto.PurchaseReqCharges);
}));
purchaseReq.UpdateBy(userId);
await purchaseReqRepo.SaveChangesAsync();
return NoContent();
}
当将purchaseReqDto
映射到purchaseReq
时,我得到错误:
AutoMapper,System. InvalidOperationExcept:实体的实例 无法跟踪类型"AcquiseReqCharge",因为另一个实例 已在跟踪具有密钥值"{Id:3}"的.当附接 现有实体,确保只有一个实体实例具有给定 附加了关键值.
我不知道我做错了什么.