2017-12-20 33 views
2

私はASPNETZERO MVC JQuery .Netコア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を返すことがわかります。しかし、実行コードは飛び回り、突然突然、プライベートメソッドから真を無視し、挿入を行います。 私はこの数十回、クライアント側とサーバー側でデバッグしました。 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回どこかを複製してトリガーしているときにアドレスを追加するのは、編集会社のこの2回目のモードを開いた直後です。その非常にランダムな、時にはそれは3回以上何度も2回繰り返されます。 会社のエンティティからアプリケーション内の他のページに移動した後、会社のインデックスページに戻り、編集会社のモーダルを開いて、会社に住所を追加しても問題ありません。だから明らかに会社への「最初の」訪問でモーダル編集がうまくいきます。ユーザーが会社のインデックスビューにいて、アプリサービスの重複が発生したことを複数回編集モードで再開したときです。

+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フレームワークから外れています。そして、プロジェクトに触れずに問題が何かを推測するのは難しいです。しかし、私のアドバイスです。 1つの保存メソッドを作成し、新しいメソッドにエンティティを挿入/更新しようとします。レコードのIDを確認して、挿入または保存アクションかどうかを確認します。私が見る限り、あなたはクライアントサイドに新しく挿入されたレコードのIDを設定しません。最後に、DuplicateCheckメソッドをCreateCompanyAddressメソッドにマージし、コンパイラのインライン最適化に問題があるかどうかを確認します。

関連する問題