0

我有兩個控制器調用SaveOrUpdate相同的CommandHandler。其中一個控制器是正常的MVC 控制器而另一個是WebAPI ApiController。兩者都可以在保存中正常工作,但在更新時,它只適用於不在ApiController上的正常MVC控制器。NHibernate的SaveOrUpdate存儲庫不更新,但保存數據

我檢查了來自ApiController的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

是否有一個事務包裝每個操作? – 2014-09-03 23:30:35

+0

這就是CommandHandler – Raymund 2014-09-03 23:53:44

+0

的完整代碼,MVC控制器操作是否可能有一個屬性或操作過濾器來創建/提交一個事務呢?之前我曾經看到過,當我忘記使用交易時。 – 2014-09-04 00:06:34

回答

1

requestNameChangeRepository.SaveOrUpdate(requestNameChange); 

後剛需,所以我們加上這段代碼提交更改。

requestNameChangeRepository.DbContext.CommitChanges(); 
1

對我來說似乎在API方法中不使用id字段,不應該將它設置爲命令對象嗎?

// 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 2014-09-04 20:39:23

+1

你可以嘗試requestNameChangeRepository.SaveOrUpdate(requestNameChange)後的requestNameChangeRepository.Session.Flush()嗎?在處理程序 – 2014-09-05 01:12:04

+0

它沒有解決問題,但你給了我一個想法,我應該在requestNameChangeRepository.SaveOrUpdate(requestNameChange)之後做些什麼。我如何解決它而不是requestNameChangeRepository.Session.Flush()我試過requestNameChangeRepository.DbContext.CommitChanges(); – Raymund 2014-09-05 03:32:07