0

我在 ASP.NET CORE api 中使用 EF Core 和 Auto Mapper,但我有点难以理解为什么当我通过 ID 获取数据时没有获取所有数据。

当我调试并查看数据时,它都在变量中,但是当它到达自动映射器部分时,就像一些数据被忽略了。

如何获取具有相应 ID 的所有数据。

这是我的 GetAsset by Id 方法。

[HttpGet("{key:int}", Name = "getAsset")]
        [EnableQuery]
        public async Task<ActionResult<AssetDto>> GetAsset(int key)
        {
            var asset = await _context.Assets.Include(c => c.Category)
                .Include(m => m.Manufacturer)
                .Include(c => c.Condition)
                .Include(l => l.Location)
                .Include(f => f.AssetFiles)
                .FirstOrDefaultAsync(i => i.Id == key);
            
            if (asset == null) return NotFound();

            var assetDto = _mapper.Map<AssetDto>(asset);
            return assetDto;
        }

这是我使用自动映射器的映射

CreateMap<Asset, AssetDto>().ReverseMap();

这是我的 AssetDTO


public class AssetDto
    {   //  Get and sets the Id property
        public int Id { get; set; }
        // Gets and sets the Name Property and sets it to required
        [Required]
        public string Name { get; set; }
        // Gets and sets the CategoryId property
        public int CategoryId { get; set; }
        // Gets and sets the CategoryName property set it to NotMapped
        [NotMapped]
        public string CategoryName { get; set; }
        // Gets and sets the ManufacturerId property
        public int ManufacturerId { get; set; }
        // Gets and sets the ManufacturerName property set it to NotMapped
        [NotMapped]
        public string ManufacturerName { get; set; }
        //Gets and sets the Model property
        public string Model { get; set; }
        //Gets and sets the SerialNumber property
        public string SerialNumber { get; set; }
        // Gets and sets the PurchasePlace property
        public string PurchasePlace { get; set; }
        // Gets and sets the Quantity property
        public int Quantity { get; set; }
        // Gets and sets the AcquiredDate property
        public DateTime AcquiredDate { get; set; }
        // Gets and sets the PurchasePrice property/
        public float PurchasePrice { get; set; }
        // Gets and sets the CurrentValue property
        public float CurrentValue { get; set; }
        //Gets and sets the ConditionId property
        public int ConditionId { get; set; }
        // Gets and sets the ConditionName property set it to NotMapped/
        [NotMapped]
        public string ConditionName { get; set; }
        // Gets and sets the LocationId property
        public int LocationId { get; set; }
        // Gets and sets the LocationName property set it to NotMapped
        [NotMapped]
        public string LocationName { get; set; }
        // Gets and sets the RetiredDate property
        public DateTime RetiredDate { get; set; }
        // Gets and sets the Description property
        public string Description { get; set; }
        // Gets and sets the Files property set it to NotMapped
        [NotMapped]
        public ICollection<AssetFileDto> Files { get; set; } <-- updated
    }

和我的资产模型

public class Asset
    {   // Int property that gets/sets id
        public int Id { get; set; }
        // String property that gets/sets Name
        [Required]
        public string Name { get; set; }
        //Foreign Key
        //Int property that gets/sets category id
        public int? CategoryId { get; set; }
        // Foreign Key
        // Int property that gets/sets Manufacturer id
        public int? ManufacturerId { get; set; }
        // String property that gets/sets model
        public string Model { get; set; }
        // String property that gets/sets serial number
        public string SerialNumber { get; set; }
        // String property that gets/sets purchase place
        public string PurchasePlace { get; set; }
        //Int property that gets/sets quantity
        public int? Quantity { get; set; }
        // Datetime property that gets/sets acquired date
        public DateTime AcquiredDate { get; set; }
        // Float property that gets/sets purchase price
        public float? PurchasePrice { get; set; } 
        //Float property that gets/sets current value
        public float? CurrentValue { get; set; }
        // Foreign Key
        // Int property that gets/sets condition id
        public int? ConditionId { get; set; }
        // Foreign Key
        // Int property that gets/sets location id
        public int? LocationId { get; set; }
        // Datetime property that gets/sets retired date
        public DateTime RetiredDate { get; set; }
        //String property that gets/sets description
        public string Description { get; set; }
        // Foreign Key
        // Collection of asset files
        public ICollection<AssetFile> AssetFiles { get; set; }
        // Navigation Property
        public Category Category { get; set; }
        // Navigation Property
        public Manufacturer Manufacturer { get; set; }
        // Navigation Property
        public Condition Condition { get; set; }
        //Navigation Property
        public Location Location { get; set; }
    } 

我缺少的数据是 CategoryName、ManufacturerName、ConditionName LocationName 以及连接到资产的所有资产文件

当我在邮递员中执行正常的获取请求时,我得到所有数据都没有问题。但是当通过 ID 获取时,上面的字段丢失了,我不知道为什么

任何指导将不胜感激

更新:

资产文件 DTO

public class AssetFileDto
    {
        // Int property that gets/sets the id
        public int Id { get; set; }
        // Byte property that gets/sets the files
        public byte[] Files { get; set; }
        // String property that gets/sets the name
        public string Name { get; set; }
        // String property that gets/sets the mime type
        public string MimeType { get; set; }
    }

资产文件.cs

public class AssetFile
    {
        // Int property that gets/sets the id
        public int? Id { get; set; }
        // Byte property that gets/sets the File
        public byte[] File { get; set; }
        // String property that gets/sets Name
        public string Name { get; set; }
        // String property that gets/sets the mime type
        public string MimeType { get; set; }
        //Int property that gets/sets the asset id 
        public int AssetId { get; set; }
        // Asset navigation property
        public Asset Asset { get; set; }
    }
4

1 回答 1

0

您需要扩展您的映射配置文件。AutoMapper 无法为您解决所有问题。它只会自动映射具有相同名称的属性。

例如,如果你想CategoryName

CreateMap<Asset, AssetDto>()
  .ForMember(x => x.CategoryName, x => x.MapFrom(y => y.Category.Name))
  .ReverseMap();

它与这个问题没有直接关系,但我建议您使用ProjectTo这样您就只选择您需要的字段,而不是将它们加载到内存中然后过滤。


我通过将您的实体添加到本地项目来检查它是否有效。我更改的一些内容是用于演示的一部分,因此您只需注意更改,然后将相关更改应用于您的代码。

控制器/服务

注入IMapper和使用ProjectTo

AutoMapper.Extensions.Microsoft.DependencyInjection如果您还没有,您将需要它)。

private readonly IMapper Mapper;

/* Inject into controller constructor */

public async Task<IActionResult> GetAsset(int key)
{
    var asset = await Db.Assets
            .Where(i => i.Id == key)
            .ProjectTo<AssetDto>(Mapper.ConfigurationProvider)
            .FirstOrDefaultAsync();

    if (asset == null) return NotFound();

    return Json(asset);
}

AssetFileDto

如果你想让它与你的匹配AssetFileFiles应该调用File.

 public byte[] File { get; set; }

映射配置文件

然后你应该有一个看起来像这样的映射配置文件

 CreateMap<Asset, AssetDto>()
     .ForMember(x => x.Files, x => x.MapFrom(y => y.AssetFiles));

 CreateMap<AssetFile, AssetFileDto>();
于 2020-11-18T08:09:06.320 回答