2017-08-10 59 views
0

我正在尝试构建一个在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发生。

我希望得到一些帮助,以解决这一点,并希望这是一些简单的我只是想念

+0

一般来说,如果您要遵循此模式并使用实体框架,则应将EF上下文视为工作单元,这意味着您应该将上下文封装到每个存储库方法中的使用块中。 –

+0

您是如何配置DI容器以将价格注入控制器的? –

+0

听起来像你正在注册你的DbContext作为单身人士,你不应该这样做。 DbContext应该始终注册为有作用域(每个请求一个实例) – Tseng

回答

0

请尝试关注

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

谢谢@tchelidze,我喜欢这种格式化的方式,并且它(第一次)没有.AsNoTracking()添加就能正常工作。但是.AsNoTracking()不起作用并且无法生成。我不能添加'使用System.Data'给c在上下文中,所以它不认识它我害怕 - 不知道为什么? – Huw

+0

@Huw为什么不能使用add'using'语句? – tchelidze

+0

我不确定(这可能是问题)。它不允许'使用System.Data.Entity'并且不能识别它。它不会显示在Intellisense和构建错误上。我将重新安装实体框架以查看是否可以解决此问题。 – Huw