【问题标题】:Web Api returns same data multiple timesWeb Api 多次返回相同的数据
【发布时间】:2021-02-28 02:56:46
【问题描述】:
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多次返回相同的数据。

【问题讨论】:

  • 能否分享GrowerVillage的实体配置代码?

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


【解决方案1】:

首先,不要这样做:

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)

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2023-01-25
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2021-08-24
    相关资源
    最近更新 更多