我正在尝试构建一个在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)
。
我希望得到一些帮助来解决这个问题,并希望它是一个简单的东西,我只是错过了。
答案 0 :(得分:0)
尝试以下
var prices =
_context
.LiveProduct
.AsNoTracking()
.FirstOrDefault(m => m.countryCode == cCode && m.sku == findSKU);