我正在尝试构建一个在Azure中托管的webservice API应用程序,该应用程序在数据库中查找产品价格。这是使用C#中的Visual Studio 2017开发的。对C#,MVC和.netcore相对陌生(我知道,不是一个好的起点:-))我一直在关注各种教程,并遵循设计最佳实践来开发webapp。这包括使用Repository Pattern方法创建一个接口作为控制器的一部分。MVC存储库模式查询缓存问题
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);
}
}
}
的代码,上面的,原则上工作正常,我可以锻炼这一点,并取回正确的结果我第一次打电话给这个。有一个单独的web应用程序更新这个数据库,如果价格单独更新,上面的API查询继续返回原始数据,而不是更新结果。
查看并搜索了这个问题,我假设有一般的EF类型缓存正在进行,并且我应该使用类似AsNoTracking()
或类似的东西来防止此缓存发生?不过,我无法看到在上述场景中应用AsNoTracking()
(例如,它不会让我添加using
名称空间) - 但这是我认为我的经验不足真的踢在:-(
当我调试,我可以在第一时间看到这个运行时创建的_context
但这不是重复任何后续查询。PriceRepo = _repo
每次但not _context = context
发生。
我希望得到一些帮助,以解决这一点,并希望这是一些简单的我只是想念
一般来说,如果您要遵循此模式并使用实体框架,则应将EF上下文视为工作单元,这意味着您应该将上下文封装到每个存储库方法中的使用块中。 –
您是如何配置DI容器以将价格注入控制器的? –
听起来像你正在注册你的DbContext作为单身人士,你不应该这样做。 DbContext应该始终注册为有作用域(每个请求一个实例) – Tseng