0

J'ai deux contrôleurs qui appellent le même CommandHandler pour SaveOrUpdate. L'un des contrôleurs est le contrôleur MVC normal tandis que l'autre est un WebAPI ApiController. Les deux fonctionnent bien dans Enregistrer, mais sur Update il ne fonctionne que pour le contrôleur MVC normal pas sur le ApiController.NHibernate SaveOrUpdate Repository ne met pas à jour mais enregistre les données

J'ai vérifié le ViewModel provenant de l'ApiController et son peuplement exactement le même que le contrôleur normal. J'ai également fait un peu de traçage sur la base de données et il semble qu'il n'exécute pas la requête de mise à jour il ne tient simplement pas compte des données soumises.

Voici le code

public class SaveOrUpdateRequestNameChangeCommandHandler : ICommandHandler<SaveOrUpdateRequestNameChangeCommand> 
{ 
    private readonly INHibernateRepository<RequestStatus> requestStatusRepository; 

    private readonly INHibernateRepository<RequestNameChange> requestNameChangeRepository; 

    public SaveOrUpdateRequestNameChangeCommandHandler(
     INHibernateRepository<RequestStatus> requestStatusRepository, 
     INHibernateRepository<RequestNameChange> requestNameChangeRepository) 
    { 
     this.requestStatusRepository = requestStatusRepository; 
     this.requestNameChangeRepository = requestNameChangeRepository; 
    } 

    public void Handle(SaveOrUpdateRequestNameChangeCommand command) 
    {   
     var requestNameChange = command.RequestNameChangeId.HasValue 
      ? requestNameChangeRepository.Get(command.RequestNameChangeId.Value) 
      : new RequestNameChange(); 

     requestNameChange.Username = command.Username; 
     requestNameChange.OriginalFirstName = command.OriginalFirstName; 
     requestNameChange.OriginalLastName = command.OriginalLastName; 
     requestNameChange.NewFirstName = command.NewFirstName; 
     requestNameChange.NewLastName = command.NewLastName; 
     requestNameChange.EffectiveDate = command.EffectiveDate; 
     requestNameChange.NewEmailAddress = command.NewEmailAddress; 
     requestNameChange.IsRetailUser = command.IsRetailUser; 
     requestNameChange.SpecialRequirements = command.SpecialRequirements; 
     requestNameChange.Notes = command.Notes; 
     requestNameChange.ServiceDeskId = command.ServiceDeskId; 
     requestNameChange.ServiceDeskUrl = command.ServiceDeskUrl; 
     if (command.RequestStatusId != null) 
      requestNameChange.RequestStatus = requestStatusRepository.Get(command.RequestStatusId.Value); 
     requestNameChange.DateCreated = command.DateCreated; 
     requestNameChange.CreatedBy = command.CreatedBy; 

     requestNameChangeRepository.SaveOrUpdate(requestNameChange); 

     command.RequestNameChangeId = requestNameChange.Id; 
    } 
} 

Je ne sais pas ce que je fais de mal et cela me rend fou pour les deux derniers jours.

Voici les valeurs issues de la normale Contrôleur

enter image description here

ce qui est la valeur venant de la ApiController

enter image description here

Comme vous pouvez le voir, ils sont exactement identique à la CreateBy (ne vous inquiétez pas je l'ai fait identique aussi sur mes tests) mais ceux-ci de l'ApiController ne mettent pas à jour les valeurs.

Toute aide sera grandement appréciée.

MISE A JOUR --------- ---------

Voici les codes pour mon Controller

[HttpPost] 
[Transaction] 
public ActionResult SaveOrUpdate(RequestNameChangesViewModel viewModel, [DataSourceRequest]DataSourceRequest request) 
{ 
    if (ModelState.IsValid) 
    { 
     var command = new SaveOrUpdateRequestNameChangeCommand(
         viewModel.RequestNameChangeId, 
         viewModel.Username, 
         viewModel.OriginalFirstName, 
         viewModel.OriginalLastName, 
         viewModel.NewFirstName, 
         viewModel.NewLastName, 
         viewModel.EffectiveDate, 
         viewModel.NewEmailAddress, 
         viewModel.IsRetailUser, 
         viewModel.SpecialRequirements, 
         viewModel.Notes, 
         viewModel.ServiceDeskId, 
         viewModel.ServiceDeskUrl, 
         viewModel.RequestStatusId, 
         viewModel.DateCreated, 
         viewModel.CreatedBy 
         ); 

     if (ModelState.IsValid) 
     { 
      commandProcessor.Process(command); 
      viewModel.RequestNameChangeId = command.RequestNameChangeId; 
     } 
    } 

    var result = new[] { viewModel }.ToDataSourceResult(request, ModelState); 

    return Json(result); 
}  

et c'est le code pour

ApiController
// POST Api/<controller> 
[Transaction] 
public void Post(RequestNameChangesViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var command = new SaveOrUpdateRequestNameChangeCommand(
      viewModel.RequestNameChangeId, 
      viewModel.Username, 
      viewModel.OriginalFirstName, 
      viewModel.OriginalLastName, 
      viewModel.NewFirstName, 
      viewModel.NewLastName, 
      viewModel.EffectiveDate, 
      viewModel.NewEmailAddress, 
      viewModel.IsRetailUser, 
      viewModel.SpecialRequirements, 
      viewModel.Notes, 
      viewModel.ServiceDeskId, 
      viewModel.ServiceDeskUrl, 
      viewModel.RequestNameChangeId, 
      viewModel.DateCreated, 
      viewModel.CreatedBy 
      ); 

     if (ModelState.IsValid) 
     { 
      commandProcessor.Process(command); 
      viewModel.RequestNameChangeId = command.RequestNameChangeId; 
     } 
    } 
} 

// PUT Api/<controller>/5 
[Transaction] 
public void Put(int id, RequestNameChangesViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var command = new SaveOrUpdateRequestNameChangeCommand(
      viewModel.RequestNameChangeId, 
      viewModel.Username, 
      viewModel.OriginalFirstName, 
      viewModel.OriginalLastName, 
      viewModel.NewFirstName, 
      viewModel.NewLastName, 
      viewModel.EffectiveDate, 
      viewModel.NewEmailAddress, 
      viewModel.IsRetailUser, 
      viewModel.SpecialRequirements, 
      viewModel.Notes, 
      viewModel.ServiceDeskId, 
      viewModel.ServiceDeskUrl, 
      viewModel.RequestNameChangeId, 
      viewModel.DateCreated, 
      viewModel.CreatedBy 
      ); 

     if (ModelState.IsValid) 
     { 
      commandProcessor.Process(command); 
      viewModel.RequestNameChangeId = command.RequestNameChangeId; 
     } 
    } 
} 
+0

Y a-t-il une transaction encapsulant chaque opération? –

+0

Est-ce que le code complet pour le CommandHandler – Raymund

+0

l'action du contrôleur MVC peut-être avoir un attribut ou des filtres d'action qui créent/commettent une transaction autour de lui? J'ai déjà vu ça quand j'oublie d'utiliser une transaction. –

Répondre

1

Après

requestNameChangeRepository.SaveOrUpdate(requestNameChange); 

juste besoin de valider les modifications que nous ajoutons ce morceau de code.

requestNameChangeRepository.DbContext.CommitChanges(); 
1

il me semble comme dans la méthode API champ id est pas utilisé, ne doit pas le mettre à l'objet de commande?

// PUT Api/<controller>/5 
[Transaction] 
public void Put(int id, RequestNameChangesViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var command = new SaveOrUpdateRequestNameChangeCommand(
      id, 
      viewModel.Username, 
      viewModel.OriginalFirstName, 
      viewModel.OriginalLastName, 
      viewModel.NewFirstName, 
      viewModel.NewLastName, 
      viewModel.EffectiveDate, 
      viewModel.NewEmailAddress, 
      viewModel.IsRetailUser, 
      viewModel.SpecialRequirements, 
      viewModel.Notes, 
      viewModel.ServiceDeskId, 
      viewModel.ServiceDeskUrl, 
      viewModel.RequestNameChangeId, 
      viewModel.DateCreated, 
      viewModel.CreatedBy 
      ); 

     if (ModelState.IsValid) 
     { 
      commandProcessor.Process(command); 
      viewModel.RequestNameChangeId = command.RequestNameChangeId; 
     } 
    } 
} 
+0

J'ai aussi essayé ceci toujours pas de chance – Raymund

+1

Pouvez-vous essayer, requestNameChangeRepository.Session.Flush() après requestNameChangeRepository.SaveOrUpdate (requestNameChange); dans le gestionnaire –

+0

Il n'a pas résolu le problème mais vous m'avez donné une idée que je devrais faire quelque chose après requestNameChangeRepository.SaveOrUpdate (requestNameChange). Comment je l'ai réparé est à la place de requestNameChangeRepository.Session.Flush() J'ai essayé requestNameChangeRepository.DbContext.CommitChanges(); – Raymund

Questions connexes