MVC存储库模式查询缓存问题

时间:2017-08-10 07:25:03

标签: c# asp.net-mvc linq asp.net-core repository-pattern

我正在尝试构建一个在Azure中托管的Web服务API应用程序,用于在数据库中查找产品价格。这是使用C#中的Visual Studio 2017开发的。相对较新的C#,MVC和.netcore(我知道,不是一个好的起点:-))我一直在关注各种教程并遵循设计最佳实践来开发webapp。这包括使用存储库模式方法创建作为控制器一部分的接口。

namespace i*******api.Models
{
    public interface IPrice
    {
        LiveProduct Find(string sku, string cCode);
    }
}

然后

namespace i*******api.Models
{
    public class Price : IPrice
    {
        static List<LiveProduct> LiveList = new List<LiveProduct>();
        private readonly ApplicationDbContext _context;

        public Price(ApplicationDbContext context)
        {
            _context = context;   
        }

        public LiveProduct Find(string findSKU, string cCode)

        {
            var prices = (from m in _context.LiveProduct
                          where m.countryCode == cCode && m.sku == findSKU
                          select m).FirstOrDefault();

            return prices;
        } 

最后是控制器...

namespace i*******api.Controllers
{
    [Produces("application/json")]
    [Route("api/Prices")]
    public class PricesController : Controller
    {
        public IPrice PriceRepo { get; set; }

        public PricesController(IPrice _repo)
        {
            PriceRepo = _repo;
        }

        [HttpGet("{id}", Name = "GetPrice")]
        public IActionResult GetById(string id, string cCode)
        {
            var item = PriceRepo.Find(id,cCode);
            if (item == null)
            {
                return NotFound();
            }
            return new ObjectResult(item);
        }
    } 
}

上面的代码原则上运行正常,我可以在第一次调用它时执行此操作并返回正确的结果。有一个单独的webapp用于更新此数据库,如果价格单独更新,则上面的API查询将继续返回原始数据而非更新结果。

在研究并搜索了这个问题之后,我假设有一般的EF类型缓存,我应该使用类似AsNoTracking()或类似的东西来防止这种缓存发生?但是我无法在上面的场景中看到应用AsNoTracking()(例如,它不允许我添加using命名空间) - 但这就是我猜我缺乏经验的地方真的很开心: - (

当我调试时,我可以看到第一次运行时_context已创建,但在任何后续查询中都不会重复此操作。 PriceRepo = _repo每次发生not _context = context,但SELECT DISTINCT d.id, c.timestamp, c.id, c.working FROM devices d INNER JOIN call_logs c on d.id = c.device_id AND c.timestamp = (SELECT max(t.timestamp) FROM call_logs t WHERE t.device_id = d.id)

我希望得到一些帮助来解决这个问题,并希望它是一个简单的东西,我只是错过了。

1 个答案:

答案 0 :(得分:0)

尝试以下

 var prices =
    _context
      .LiveProduct
      .AsNoTracking()
      .FirstOrDefault(m => m.countryCode == cCode && m.sku == findSKU);