2017-12-20 18 views
2

ASPNETZERO MVC JQuery .Net core 2.0 템플릿에 SAAS 앱을 만들고 있습니다. 이 문제는 이전 호의 후속 조치로 here으로 게시되었습니다. 그래서 내 "companyAddress"엔티티 테이블에 중복 레코드를 허용하지 않는 메소드를 내 앱 서비스에 추가했습니다. create 메소드가 insertAsync를 실행하기 전에 개인 테이블을 호출하여 테이블의 해당 레코드를 확인합니다. 다음은 앱 서비스 코드입니다.여러 번 실행되는 앱 서비스 호출을 만듭니다.

 public async Task CreateCompanyAddress(CreateCompanyAddressInput input) 
    { 
     //Check for duplicate before inserting 
     if (DuplicateCheck(input)) 
     { 
      return; 
     } 
     else 
     { 
      //Get current address data 
      var addr = await _addressRepository.GetAsync(input.AddressId); 

      //Get current company data 
      var comp = await _cmpRepository.GetAsync(input.CompanyId); 

      input.Company = comp; 
      input.Address = addr; 
      var CA = input.MapTo<CompanyAddress>(); 

      await _cmpaddressRepository.InsertAsync(CA); 
      Logger.Info("CompanyAddressService - NEW entry detected. Company Id=" + input.CompanyId + " Address Id=" + input.AddressId); 
     } 
    } 

    private bool DuplicateCheck(CreateCompanyAddressInput input) 
    { 
     var duplicate = _cmpaddressRepository.GetAll() 
      .Where(C => C.Company.Id == input.CompanyId && C.Address.Id == input.AddressId); 
     var total = duplicate.Count(); 
     if (total > 0) 
     { 
      Logger.Info("CompanyAddressService - Duplicate entry detected. Company Id=" + input.CompanyId + " Address Id=" + input.AddressId); 
      return true; 
     } 
     return false; 
    } 

DEBUG에서 코드를 실행하면 내 개인 메소드가 중복 항목을 찾아서 true를 반환하는 것을 볼 수 있습니다. 하지만 실행 코드가 갑작스럽게 개인 메서드에서 true를 무시하고 여전히 삽입을 수행합니다. 클라이언트 측과 서버 측에서 수십 번 디버깅했습니다. C# 코드를 통해 VS2017 디버거를 실행할 때 디버거가 현재 실행중인 코드의 위치를 ​​추적하지 못하는 경우가 있습니다. 그런 다음 NursingOps17EntityFrameworkCoreModule 클래스에 코드를 표시하고 아래 표시된 메소드로 이동합니다. 그것은 기존의 IF 연결 조건의 else 조건을 계속 유지합니다.

 public override void PreInitialize() 
    { 
     if (!SkipDbContextRegistration) 
     { 
      Configuration.Modules.AbpEfCore().AddDbContext<NursingOps17DbContext>(options => 
      { 
       if (options.ExistingConnection != null) 
       { 
        NursingOps17DbContextConfigurer.Configure(options.DbContextOptions, options.ExistingConnection); 
       } 
       else 
       { 
        NursingOps17DbContextConfigurer.Configure(options.DbContextOptions, options.ConnectionString); 
       } 
      }); 
     } 
    } 

API 호출 중에 연결이 끊어지는 것처럼 보입니까? 위의 메서드를 호출하여 내 부분에 대한 추측.

MVC 앱의 로그 파일을 볼 때. companyAddress에 대한 API 작성 메소드가 여러 번 호출되는 것을 볼 수 있습니다. 로그 스 니펫이 아래에 나와 있습니다.

INFO 2017-12-19 15:45:46,121 [9 ] ore.Mvc.Internal.ControllerActionInvoker - Executed action EXLNT.NursingOps17.NursingOps.AddressAppService.CreateAddress (EXLNT.NursingOps17.Application) in 18.1348ms 
INFO 2017-12-19 15:45:46,122 [9 ] soft.AspNetCore.Hosting.Internal.WebHost - Request finished in 27.7701ms 200 application/json; charset=utf-8 
INFO 2017-12-19 15:45:46,128 [4 ] soft.AspNetCore.Hosting.Internal.WebHost - Request starting HTTP/1.1 POST http://localhost:62114/api/services/app/CompanyAddress/CreateCompanyAddress application/json 31 
INFO 2017-12-19 15:45:46,131 [9 ] soft.AspNetCore.Hosting.Internal.WebHost - Request starting HTTP/1.1 POST http://localhost:62114/api/services/app/CompanyAddress/CreateCompanyAddress application/json 31 
INFO 2017-12-19 15:45:46,133 [10 ] soft.AspNetCore.Hosting.Internal.WebHost - Request starting HTTP/1.1 POST http://localhost:62114/api/services/app/CompanyAddress/CreateCompanyAddress application/json 31 
INFO 2017-12-19 15:45:46,136 [4 ] tion.Cookies.CookieAuthenticationHandler - AuthenticationScheme: Identity.Application was successfully authenticated. 
INFO 2017-12-19 15:45:46,138 [10 ] tion.Cookies.CookieAuthenticationHandler - AuthenticationScheme: Identity.Application was successfully authenticated. 
INFO 2017-12-19 15:45:46,140 [9 ] tion.Cookies.CookieAuthenticationHandler - AuthenticationScheme: Identity.Application was successfully authenticated. 
INFO 2017-12-19 15:45:46,146 [4 ] ore.Mvc.Internal.ControllerActionInvoker - Executing action method EXLNT.NursingOps17.NursingOps.CompanyAddressAppService.CreateCompanyAddress (EXLNT.NursingOps17.Application) with arguments (EXLNT.NursingOps17.NursingOps.Dto.CreateCompanyAddressInput) - ModelState is Valid 
INFO 2017-12-19 15:45:48,709 [9 ] ore.Mvc.Internal.ControllerActionInvoker - Executing action method EXLNT.NursingOps17.NursingOps.CompanyAddressAppService.CreateCompanyAddress (EXLNT.NursingOps17.Application) with arguments (EXLNT.NursingOps17.NursingOps.Dto.CreateCompanyAddressInput) - ModelState is Valid 
INFO 2017-12-19 15:45:49,657 [10 ] ore.Mvc.Internal.ControllerActionInvoker - Executing action method EXLNT.NursingOps17.NursingOps.CompanyAddressAppService.CreateCompanyAddress (EXLNT.NursingOps17.Application) with arguments (EXLNT.NursingOps17.NursingOps.Dto.CreateCompanyAddressInput) - ModelState is Valid 
INFO 2017-12-19 15:47:12,504 [10 ] ps17.NursingOps.CompanyAddressAppService - CompanyAddressService - NEW entry detected. Company Id=2 Address Id=3 
INFO 2017-12-19 15:47:12,533 [51 ] ps17.NursingOps.CompanyAddressAppService - CompanyAddressService - NEW entry detected. Company Id=2 Address Id=3 
INFO 2017-12-19 15:47:12,533 [12 ] ps17.NursingOps.CompanyAddressAppService - CompanyAddressService - NEW entry detected. Company Id=2 Address Id=3 

제 노력에도 불구하고 이러한 여러 호출을 companyAddress API 서비스 메소드에 발생시키는 트리거를 찾을 수없는 것 같습니다. 이 정보가 많아서 누군가가 도움을 받기가 어려울 수도 있습니다. 나는 클라이언트를 위해 앱에서 홀로 작업하는 독립적 인 개발자입니다. 이 문제에 관해 도움이나 빛이 있다면 도움이 될 것입니다.

일반적으로 문제가 발생하는 경우는입니다. 회사의 편집 회사 모달을 엽니 다. 나는 주소 만들기 버튼을 클릭하여 주소를 만들어 모달을 만든다. 저는 회사에 주소를 추가하기 위해이 작업을 2 ~ 3 번합니다. 이것은 제대로 작동하며 companyAddress 엔티티가 제대로 업데이트됩니다. 그런 다음 회사 편집 모드를 닫고 (취소 버튼 클릭) 회사 색인보기로 돌아갑니다. 그런 다음 동일한 회사 또는 다른 회사의 편집 회사 모달을 엽니 다. 그런 다음 동일한 단계를 반복하여 새 주소를 만듭니다. companyAddress 앱 서비스가 2 ~ 4 번 어디서나 복제되고 실행될 때 주소를 추가하는 것은 편집 회사 모달의 "두 번째"개방 직후입니다. 그것의 아주 무작위, 때때로 두 번 다른 시간을 세 번 반복합니다. 회사 엔티티에서 응용 프로그램의 다른 페이지로 이동 한 다음 회사 색인 페이지로 돌아간 다음 편집 회사 모달을 열어 모든 회사에 주소를 추가하면 제대로 작동합니다. 그래서 회사를 처음으로 방문하여 모달 편집을하면 문제가 해결됩니다. 사용자가 회사 색인보기를 사용하여 응용 프로그램 서비스 복제가 발생하는 여러 번 수정 모달을 다시 열 때입니다.

+0

@aaron 취소 버튼 클릭 이벤트는 내 코드의 일부가 아닙니다. 이는 템플릿에 제공된 _ModalFooterWithSaveAndCancel.cshtml에 의해 처리됩니다. – exlnt

답변

2

제 노력에도 불구하고 이러한 여러 호출을 companyAddress API 서비스 메소드에 발생시키는 트리거를 찾을 수없는 것 같습니다. 이전 질문에 대한 답변에서

cancelsave에서 .off 및하지를 호출합니다.

.offthis.init = ...으로 이동하십시오.

this.init = function (modalManager) { 
    _modalManager = modalManager; 

    // ... 

    _modalManager.onClose(function() { 
     abp.event.off('addressCreated', addressCreated); // Turn off this handler 
    }); 
}; 
+0

감사! 그건 복제를 중단 한 것 같습니다! 너는 구세주 야 !! – exlnt

0

우선이 모든 것은 Asp.net Boilerplate 프레임 워크에서 완전히 벗어났습니다. 그리고 프로젝트를 건드리지 않고 문제가 무엇인지 추측하기는 어렵습니다. 하지만 내 조언은; 하나의 저장 메소드를 만들고 새로운 메소드에 엔티티를 삽입/업데이트하려고 시도하십시오. 레코드의 ID를 확인하여 삽입 또는 저장 작업인지 확인하십시오. 내가보기 엔 클라이언트 측에 새로 삽입 된 레코드의 ID를 설정하지 않는다. 마지막으로 DuplicateCheck 메서드를 CreateCompanyAddress 메서드에 병합하여 컴파일러의 인라인 최적화에 문제가 있는지 이해합니다.