2017-12-20 5 views
2

Ich baue eine SAAS-App auf dem ASPNETZERO MVC JQuery .Net Core 2.0 Vorlage. Dieses Problem ist ein Follow-up zu meiner früheren Ausgabe here. Daher habe ich die Methode in meinem App-Dienst hinzugefügt, um den doppelten Eintrag in meiner Entitätstabelle "companyAddress" NICHT zuzulassen. Bevor die create-Methode den insertAsync ausführt, rufe ich eine private Methode auf, um nach dem angegebenen Datensatz in meiner Tabelle zu suchen. Hier ist der App-Servicecode.App-Service-Aufruf erstellen, der mehrmals ausgeführt wird

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

Wenn ich den Code in DEBUG ausführen, kann ich meine private Methode finden, den doppelten Eintrag zu finden und True zurückgeben. Aber der ausführende Code springt umher und dann ignoriert er plötzlich das wahre von der privaten Methode und tut noch immer den Einsatz. Ich habe diese dutzende Male auf der Client-Seite und auf der Server-Seite debugged. Wenn ich den VS2017-Debugger über den C# -Code ausführe, gibt es Situationen, in denen der Debugger den Überblick darüber verliert, wo der aktuell ausgeführte Code ist. Dann zeigt es den Code in der NursingOps17EntityFrameworkCoreModule-Klasse und geht in die unten gezeigte Methode über. Es trifft weiterhin auf die else-Bedingung der IF-Verbindungsprüfung.

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

So sieht es aus wie die Verbindung in der Mitte der API-Aufruf verloren geht? Nur eine Vermutung meinerseits, basierend auf der oben genannten Methode.

Wenn ich mir die Protokolldatei für die MVC-App anschaue. Ich kann die API create-Methode für CompanyAddress mehrmals aufgerufen aufrufen. Snippet des Protokolls wird unten angezeigt.

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 

Trotz all meiner Bemühungen kann ich nicht um den Auslöser zu finden scheinen, dass diese mehrere Anrufe an die API-Service-Methode company verursacht. Mir ist klar, dass es vielleicht schwierig für jemanden ist, mit so vielen Informationen zu helfen. Ich bin ein unabhängiger Entwickler, der alleine an einer App für einen Kunden arbeitet. Jede Hilfe oder jedes Licht, das irgendjemand in diesem Fall ausstrahlen könnte, wäre sehr hilfreich.

Hier tritt das Problem in der Regel auf. Ich öffne die Firma bearbeiten Modal für ein Unternehmen. Ich klicke auf create address button, um die Adresse zu öffnen. Ich mache das zwei- oder dreimal, um Adressen für das Unternehmen hinzuzufügen. Dies funktioniert einwandfrei, die Entität CompanyAddress wird ordnungsgemäß aktualisiert. Ich schließe dann die Firma bearbeiten modal (Schaltfläche Abbrechen klicken) und zurück zu meiner Firma Indexansicht. Dann öffne ich die Edit Company Modal für die gleiche Firma oder andere Firma. Ich wiederhole dann die gleichen Schritte, um eine neue Adresse zu erstellen. Es ist direkt nach dieser "zweiten" Eröffnung der Firma bearbeiten Modal, Adressen hinzuzufügen, wenn der CompanyAddress App-Service dupliziert und löst überall von 2 bis 4 mal. Es ist sehr zufällig, manchmal wiederholt es zweimal andere Male drei oder mehr Male. Wenn ich von der Unternehmensentität zu einer anderen Seite in der Anwendung navigieren und dann komme ich zurück auf die Firmenindexseite und dann öffnen Sie die Firma bearbeiten Modal, um Adressen zu jedem Unternehmen hinzuzufügen es funktioniert gut. So klar, wenn der "erste" Besuch in der Firma edit modal passiert Dinge gut funktionieren. Wenn sich der Benutzer in der Unternehmensindexansicht befindet und das Bearbeitungsmodal mehrmals wieder öffnet, tritt die Duplikation des Anwendungsdiensts auf.

+0

@Aaron die Schaltfläche Abbrechen klicken Ereignis ist nicht Teil meines Codes. Dies wird von der in der Vorlage bereitgestellten Datei _ModalFooterWithSaveAndCancel.cshtml verarbeitet. – exlnt

Antwort

2

Trotz all meiner Bemühungen kann ich nicht scheinen, den Auslöser zu finden, der diese mehrfache Aufrufe der API-Dienstmethode CompanyAddress verursacht.

Von der Antwort auf Ihre vorherige Frage, Sie rufen nur .off in save und nicht in cancel.

Die .off in this.init = ... verschieben.

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

    // ... 

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

Danke! Das scheint das Duplizieren gestoppt zu haben! Du bist ein Lebensretter!! – exlnt

0

Zunächst ist dies komplett aus Asp.net Boilerplate Framework. Und es ist schwer zu erraten, was das Problem ist, ohne das Projekt zu berühren. Aber mein Rat ist; Versuchen Sie, eine einzige Speichermethode zu erstellen und die Entität in die neue Methode einzufügen/zu aktualisieren. Überprüfen Sie die ID des Datensatzes, um zu ermitteln, ob die Aktion eingefügt oder gespeichert wird. Soweit ich sehe, legen Sie die ID des neu eingefügten Datensatzes nicht auf der Client-Seite fest. Zuletzt füge DuplicateCheck-Methode in die CreateCompanyAddress-Methode ein, um zu verstehen, ob etwas mit der Inline-Optimierung des Compilers schief geht.

Verwandte Themen