自动映射器通过关系更新DTO

时间:2019-03-19 10:11:06

标签: entity-framework-core automapper dto

我正在尝试使用自动映射器更新产品实体。产品实体与variOption实体有关系。当我执行更新时,我收到异常: “ InvalidOperationException:无法跟踪实体类型'VariOption'的实例,因为已经跟踪了另一个具有相同'{'Id'}键值的实例。在附加现有实体时,请确保只有一个具有给定实体的实体实例键值已附加。”

有人可以建议我吗?

Product.cs

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<VariOption> VariOptions { get; set; }

    public Product() 
    {
        VariOptions = new Collection<VariOption>();
    }
}

VariOption.cs

public class VariOption
{
    public int Id { get; set; }
    public string OptName { get; set; } 
    public Product Product { get; set; }
    public int ProductId { get; set; }
}

ProductForUpdateDto.cs

public class ProductForUpdateDto
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }

    public ICollection<VariOptionForUpdateDto> VariOptions { get; set; }
}

VariOptionForUpdateDto.cs

public class VariOptionForUpdateDto
{
    public int Id { get; set; }
    [Required]
    public string OptName { get; set; }

    public ICollection<VariOptionTwoForUpdateDto> VariOptionTwos { get; set; }
}

MapperProfile

CreateMap<ProductForUpdateDto, Product>();
CreateMap<VariOptionForUpdateDto, VariOption>();

UpdateProductController

public async Task<IActionResult> UpdateProduct([FromBody] ProductForUpdateDto productForUpdateDto)
    {

        var productFromRepo = await _product.GetProduct(productForUpdateDto.Id);



        _mapper.Map(productForUpdateDto, productFromRepo);

        if(await _product.SaveAll())
        {
            return Ok();
        }

        return BadRequest("$Updating product {productForSaveDto.Id} failed on {type}");
    }

0 个答案:

没有答案