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