0

SaveOrUpdate에 대해 동일한 CommandHandler를 호출하는 두 개의 컨트롤러가 있습니다. 컨트롤러 중 하나는 일반 MVC 컨트롤러이고 다른 하나는 WebAPI ApiController입니다. 둘 다 잘 저장하지만 업데이트시에만 ApiController에없는 일반 MVC 컨트롤러에서만 작동합니다.NHibernate SaveOrUpdate 리포지토리가 업데이트되지 않지만 데이터를 저장합니다.

ApiController에서 가져온 ViewModel과 일반 Controller와 완전히 동일한 ViewModel을 확인했습니다. 또한 데이터베이스에서 일부 추적을 수행했으며 제출 된 데이터를 무시하는 업데이트 쿼리를 실행하지 않는 것으로 보입니다.

여기에 내가 잘못하고 오전이 일 지난 몇 위해 나를 미치게 만드는 것을 확실하지 않다 코드

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

입니다. 여기

은 일반 컨트롤러

enter image description here

에서 나오는 값이며,이 값은 당신이 그들이 볼 수 있듯이 ApiController

enter image description here

에서오고있다 CreatedBy와 완전히 똑같은 () 걱정하지 마십시오. 시합이 내 테스트에서 동일하게 만들었습니다)하지만 ApiController에서 하나의 값을 업데이 트하지 않습니다.

도움이 될 것입니다.

--------- UPDATE --------- 여기

컨트롤러

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

의 코드이며,이 코드입니다 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

각 작업을 래핑하는 트랜잭션이 있습니까? –

+0

CommandHandler – Raymund

+0

의 전체 코드가 맞습니까? MVC 컨트롤러 작업에는 트랜잭션을 생성/커밋하는 특성 또는 동작 필터가있을 수 있습니까? 나는 전에 트랜잭션을 사용하는 것을 잊었을 때 이것을 보았습니다. –

답변

1

requestNameChangeRepository.SaveOrUpdate(requestNameChange); 

후 그냥 우리가이 코드 조각을 추가 할 수 있도록 변경 사항을 적용해야합니다.

requestNameChangeRepository.DbContext.CommitChanges(); 
1

는 id 필드가 사용되지 않는 API 방법처럼 나에게 보인다,해야하지 그것은 명령 개체로 설정?

// 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

나는 여전히 이걸 시도해 보았습니다. – Raymund

+1

requestNameChangeRepository.SaveOrUpdate (requestNameChange); 후에 requestNameChangeRepository.Session.Flush()를 시도 할 수 있습니까? 처리기에서 –

+0

문제를 해결하지 못했지만 requestNameChangeRepository.SaveOrUpdate (requestNameChange) 이후에 뭔가해야한다고 생각했습니다. 어떻게 고쳐 졌는지 requestNameChangeRepository.Session.Flush() 나는 requestNameChangeRepository.DbContext.CommitChanges() 시도한; – Raymund