我有兩個控制器調用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;
}
}
我不知道我在做什麼錯的,這讓我瘋了,在過去幾天。
這裏是從正常控制器
裏的值,這是值從ApiController
未來正如你可以看到他們是與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;
}
}
}
是否有一個事務包裝每個操作? – 2014-09-03 23:30:35
這就是CommandHandler – Raymund 2014-09-03 23:53:44
的完整代碼,MVC控制器操作是否可能有一個屬性或操作過濾器來創建/提交一個事務呢?之前我曾經看到過,當我忘記使用交易時。 – 2014-09-04 00:06:34