2017-01-12 12 views
7

Korzystanie z NopCommerce 3.8, Visual Studio 2015 proff.Nopcommerce Update podmiot issue

Utworzyłem wtyczkę, która jest odpowiedzialna za nawiązywanie spokojnych połączeń z moim interfejsem API sieci Web, który udostępnia inną bazę danych niż Nop.

Proces jest wykonywany za pomocą polecenia Nop, pomyślnie odzyskuje dane i mogę wykonać i manipulować, jak widzę, bez problemów do tej pory.

Problem pojawia się, gdy próbuję zaktualizować rekord w tabeli produktów, wykonuję aktualizację ... ale nic się nie dzieje, nie zmienia się, nie ma błędu.

Uważam, że dzieje się tak z powodu kontekstu, który nie ma pojęcia o moim nowo utworzonym obiekcie produktu, jednak rysuję puste miejsce na temat tego, co muszę zrobić w odniesieniu do mojego konkretnego przykładu.

Podobne pytania zwykle odnoszą się do obiektu "model", który jest częścią parametru wywołania metody, "model" ma metodę ToEntity, która wydaje się być odpowiedzią na podobne pytanie w stosie.

Jednak mój przykład nie ma klasy/metody ToEntity prawdopodobnie dlatego, że mój parametr jest w rzeczywistości listą produktów. Aby wyjaśnić tutaj mój kod.

Sposób RestClient.cs

public async Task<List<T>> GetAsync() 
    { 
     try 
     { 
      var httpClient = new HttpClient(); 

      var json = await httpClient.GetStringAsync(ApiControllerURL); 

      var taskModels = JsonConvert.DeserializeObject<List<T>>(json); 

      return taskModels; 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 

metoda w moim klasy usługi

public async Task<List<MWProduct>> GetProductsAsync() 
    { 
     RestClient<MWProduct> restClient = new RestClient<MWProduct>(ApiConst.Products); 
     var productsList = await restClient.GetAsync(); 

     InsertSyncProd(productsList.Select(x => x).ToList()); 
     return productsList; 
    } 
private void InsertSyncProd(List<MWProduct> inserted) 
    { 
     var model = inserted.Select(x => 
     { 
      switch (x.AD_Action) 
      { 
       case "I": 
        //_productService.InsertProduct(row); 
        break; 
       case "U": 
        UpdateSyncProd(inserted); 
        ..... 

Następnie metoda wiązania i aktualizować

private void UpdateSyncProd(List<MWProduct> inserted) 
    { 
     var me = inserted.Select(x => 
     { 
      var productEnt = _productRepos.Table.FirstOrDefault(ent => ent.Sku == x.Sku.ToString()); 
      if(productEnt != null) 
      { 
       productEnt.Sku = x.Sku.ToString(); 
       productEnt.ShortDescription = x.ShortDescription; 
       productEnt.FullDescription = x.FullDescription; 
       productEnt.Name = x.Name; 
       productEnt.Height = x.Pd_height != null ? Convert.ToDecimal(x.Pd_height) : 0; 
       productEnt.Width = x.Pd_width != null ? Convert.ToDecimal(x.Pd_width) : 0; 
       productEnt.Length = x.Pd_depth != null ? Convert.ToDecimal(x.Pd_depth) : 0; 
       productEnt.UpdatedOnUtc = DateTime.UtcNow; 
      } 
      //TODO: set to entity so context nows and can update 
      _productService.UpdateProduct(productEnt); 

      return productEnt; 
     }); 

    } 

Jak widać, otrzymuję dane i przekazuję dane do pewnej metody na podstawie wyniku. Z tej listy w metodzie I iteruje i pobiera jednostkę z tabeli, a następnie aktualizuje za pośrednictwem usługi produktu za pomocą tej zmanipulowanej jednostki.

Więc czego mi tu brakuje, jestem pewien, że jest to 1 krok, i myślę, że może być albo dlatego, że 1) Kontekst wciąż nie ma pojęcia o danej jednostce, lub 2) Jej nieprawidłowe połączenia.

Podsumowanie Aktualizacja nie jest aktualizowana, prawdopodobnie z powodu braku wiedzy lub mojej metodologii jest nieprawidłowa. (prawdopodobnie oba).

UPDATE:

dodałem niektóre logger.inertlog dookoła moich usług, to przebiega w porządku, wszystko do punktu wywołania aktualizacji. Ale znowu sprawdzam produkt i nic się nie zmieniło w sekcji administratora.

plugin

mam pod warunkiem pełnego źródła, jak myślę, że może to ma coś wspólnego z resztą instalacji kodu ewentualnie?

UPDATE:

dodawali następujący dla sprawd na mojego wykonania metody.

var myprod = _productRepos.GetById(4852); 
myprod.ShortDescription = "db test"; 
productRepos.Update(myprod); 

Pomyślnie aktualizuje opis produktu. Przeniosłem moje metody z mojej usługi do klasy zadań, ale wciąż nie miałem szczęścia. Im więcej na to patrzę, tym bardziej myślę, że mój asynchronizm w jakiś sposób zabija kontekst db.

+0

Hej, czy bezpośrednio sprawdziłeś bazę? zmiany wyświetlające się tam? –

+0

Tak, zmiany nio zostały zaktualizowane, więc nie sądzę, że jest to problem z pamięcią podręczną, ale kto wie, – lemunk

+0

OK, kod wygląda dobrze, musisz zbadać więcej. –

Odpowiedz

0

Włączono asynchronizację i powiązano getbyid z nowym produktem, usunięto także lambda dla przełącznika i zmieniono go na pętlę foreach. Wygląda na to, że w końcu zaktualizujemy wyniki.

Nie można potwierdzić, że asynchronizacja jest sprawcą, obecnie api w Internecie wydaje się zwracać ten sam wynik, mimo że dane uległy zmianie (niektóre dziwne buforowanie przez deafult w rdzeniu .net), więc mam na to nowe pytanie.

AKTUALIZACJA: Wygląda na to, że problem wynika z nieprawidłowego debugowania asynchronizacji. Każda instancja, którą próbuję iterować po oczekującym wywołaniu, po prostu próbuję iterować po zbiorze, który technicznie może jeszcze nie zostać ukończony. Prawdopodobnie z powodu złego debugowania nie byłem tego świadomy.

Więc odpowiedź czeka na swoją kolekcję Następnie wykonaj iterację po.