2017-01-12 26 views
7

Sử dụng NopCommerce 3.8, Visual Studio 2015 proff.Vấn đề thực thể Cập nhật Nopcommerce

Tôi đã tạo một plugin có trách nhiệm thực hiện các cuộc gọi an toàn đến API web của tôi hiển thị một DB khác với Nop.

Quá trình này được thực hiện thông qua một nhiệm vụ nop, nó kéo thành công dữ liệu trở lại và tôi có thể bước qua và thao tác như tôi thấy phù hợp, không có vấn đề cho đến nay.

Sự cố xảy ra khi tôi cố cập nhật bản ghi trên bảng sản phẩm, tôi thực hiện cập nhật ... nhưng không có gì xảy ra không thay đổi, không có lỗi.

Tôi tin rằng điều này là do bối cảnh không có ý tưởng về đối tượng sản phẩm mới được tạo ra của tôi, tuy nhiên tôi vẽ một khoảng trống trên những gì tôi cần làm liên quan đến ví dụ cụ thể của mình.

Các câu hỏi tương tự thường tham chiếu đối tượng "mô hình" là một phần của tham số của cuộc gọi phương thức, "mô hình" có phương thức ToEntity có vẻ là câu trả lời trong câu hỏi tương tự trong ngăn xếp.

Tuy nhiên, ví dụ của tôi không có lớp học/phương pháp ToEntity có thể do tham số của tôi thực sự là danh sách sản phẩm. Để làm rõ ở đây mã của tôi.

Phương pháp trong 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; 
     } 
    } 

Phương pháp trong Service Class tôi

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); 
        ..... 

Sau đó, phương pháp này để ràng buộc và cập nhật

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; 
     }); 

    } 

Vì vậy, như bạn có thể thấy, tôi nhận dữ liệu và chuyển dữ liệu qua phương thức nhất định dựa trên kết quả. Từ danh sách đó trong phương thức I lặp lại, và kéo thực thể ra khỏi bảng, sau đó cập nhật thông qua dịch vụ sản phẩm bằng cách sử dụng thực thể thao tác đó.

Vì vậy, những gì tôi thiếu ở đây, tôi chắc chắn 1 bước của nó, và tôi nghĩ rằng nó có thể là do 1) Bối cảnh vẫn không có ý tưởng về các thực thể trong câu hỏi, hoặc 2) Các cuộc gọi không chính xác của nó.

Tóm tắt Cập nhật không cập nhật, có thể do ngữ cảnh không có kiến ​​thức HOẶC phương pháp của tôi sai. (có lẽ cả hai).

UPDATE:

tôi đã thêm một số logger.inertlog tất cả xung quanh dịch vụ của tôi, nó chạy qua tốt, tất cả đến mức tiếng gọi của bản cập nhật. Nhưng một lần nữa tôi kiểm tra sản phẩm và không có gì thay đổi trong phần quản trị.

plugin

tôi đã cung cấp nguồn đầy đủ như tôi nghĩ rằng có lẽ đây có cái gì để làm với phần còn lại của thiết lập đang thể?

UPDATE:

gia tăng sau cho testin trên thực hiện phương pháp của tôi.

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

Điều này mô tả thành công mô tả sản phẩm. Tôi đã chuyển các phương thức từ dịch vụ của mình sang lớp nhiệm vụ nhưng vẫn không có may mắn. Tôi càng nhìn vào nó càng nghĩ rằng async của tôi đang giết chết bối cảnh db bằng cách nào đó.

+0

Xin chào, Bạn đã kiểm tra cơ sở dữ liệu trực tiếp chưa? thay đổi hiển thị trên đó? –

+0

Có, nio thay đổi nơi cập nhật vì vậy tôi không nghĩ rằng nó là một vấn đề bộ nhớ cache, mặc dù những người hiểu biết – lemunk

+0

Được rồi, mã có vẻ tốt, cần phải điều tra thêm. –

Trả lời

0

Đã tắt tính năng đồng bộ hóa và ràng buộc sự tạm ẩn đối với một sản phẩm mới, cũng đã xóa lambda cho công tắc và thay đổi nó thành vòng lặp foreach. Dường như cuối cùng cập nhật kết quả.

Không thể xác nhận liệu async có phải là thủ phạm hay không, hiện tại api trên web dường như đang trả về kết quả tương tự mặc dù dữ liệu đã thay đổi (một số bộ nhớ đệm đáng sợ bằng cách điếc trong lõi .net).

CẬP NHẬT: Dường như vấn đề xuất phát từ việc gỡ lỗi không đồng bộ kém. Mỗi trường hợp tôi đang cố gắng lặp lại qua một cuộc gọi đang chờ, chỉ cần đặt im cố gắng lặp qua một bộ sưu tập về mặt kỹ thuật có thể hoặc có thể chưa hoàn thành. Và có lẽ do gỡ lỗi kém, tôi không biết.

Vì vậy, câu trả lời đang chờ bộ sưu tập của bạn Sau đó lặp lại sau.

Các vấn đề liên quan