Web Api 多次返回相同的数据

时间:2021-02-28 02:56:46

标签: asp.net-mvc entity-framework asp.net-web-api2 automapper dto

public class VillageDto
{
    public int id { get; set; }
    public string Name { get; set; }
    public string HindiName { get; set; }        
    public int CentreId { get; set; }
}

public class CentreDto
{
    public int id { get; set; }
    public string Name { get; set; }
    public string HindiName { get; set; }
}

public class BankDto
{
    public int id { get; set; }
    public string BankName { get; set; }
    public String BankShortName { get; set; }
}

public class GrowerDto
{
    public int Id { get; set; }        
    public int VillageId { get; set; }
    public VillageDto village { get; set; }
    public string Name { get; set; }
    public string FatherName { get; set; }
    public string HindiName { get; set; }
    public string HindiFatherName { get; set; }
    public string AccountNo { get; set; }
    public int CentreId { get; set; }
    public CentreDto centre { get; set; }
    public int BankId { get; set; }
    public BankDto bank { get; set; }
}
public MappingProfile()
{   
    Mapper.CreateMap<Village, VillageDto>();
    Mapper.CreateMap<VillageDto, Village>();
    Mapper.CreateMap<Grower, GrowerDto>();
    Mapper.CreateMap<GrowerDto, Grower>();
    Mapper.CreateMap<Bank, BankDto>();
    Mapper.CreateMap<BankDto, Bank>();  
}
public class GrowerController : ApiController
{
    private ApplicationDbContext _context;

    public GrowerController()
    {
        _context = new ApplicationDbContext();
    }

    public IHttpActionResult GetAllGrowers(int? pagenumber, int? pagesize)
    {
        var allgrowers = _context.growers.Include(v => v.village).ToList().Select(Mapper.Map<Grower, GrowerDto>).OrderBy(g => g.Id);
        var currentPageNumber = pagenumber ?? 1;
        var currentPageSize = pagesize ?? 5;
        return Ok(allgrowers.Skip((currentPageNumber - 1) * currentPageSize).Take(currentPageSize));       
    }
}

return results

1.种植者的主键是(id,villageid)
2.villageid也是外键,也是村庄模型的主键
3.调用api时,api多次返回相同的数据。

1 个答案:

答案 0 :(得分:0)

首先,不要这样做:

var allgrowers = _context.growers.Include(v => v.village).ToList().Select(Mapper.Map<Grower, GrowerDto>).OrderBy(g => g.Id);

相反,使用 Automapper 的 ProjectTo 方法来处理 IQueryable。上面的代码将在分页之前选择 ALL 数据并将所有内容映射到 DTO。您希望将 IQuertable 保留在末尾,以确保它构建的查询仅返回所需的数据页。

接下来,我将避免在构造函数中为 DbContext 初始化模块级变量。您希望确保在控制器完成后处理 DbContext。通常,当您使用依赖注入时,您会通过构造函数传入 DbContext 实例。由于您还没有这样做,我将删除:

public GrowerController()
{
    _context = new ApplicationDbContext();
}

而是在需要的地方将 ApplicationDbContext 范围限定在 using 块内。

// For example purposes, you need to manage the mapper configurations rather 
// than rely on the static Mapper API. 
var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Village, VillageDto>();
    cfg.CreateMap<Grower, GrowerDto>();
    cfg.CreateMap<Bank, BankDto>();
});

using (var context = new ApplicationDbContext())
{
    var query = _context.growers
        .OrderBy(g => g.Id)
        .ProjectTo<GrowerDto>(config);

    var currentPageNumber = pagenumber ?? 1;
    var currentPageSize = pagesize ?? 5;
    var results = query
        .Skip((currentPageNumber - 1) * currentPageSize)
        .Take(currentPageSize)
        .ToList();

    return Ok(results);
}

从中您可以使用断点检查 results 值,以查看是否获得了您期望的数据。如果您看到重复项,那么我会查看对您的数据库运行分析器以查看正在生成的 SQL,您可以手动运行以检查结果。我不知道什么特别可能导致重复相同的记录。您的实体映射或您的特定模式状态可能存在问题。 (FK)