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;
}
}
입니다. 여기
은 일반 컨트롤러에서 나오는 값이며,이 값은 당신이 그들이 볼 수 있듯이 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;
}
}
}
각 작업을 래핑하는 트랜잭션이 있습니까? –
CommandHandler – Raymund
의 전체 코드가 맞습니까? MVC 컨트롤러 작업에는 트랜잭션을 생성/커밋하는 특성 또는 동작 필터가있을 수 있습니까? 나는 전에 트랜잭션을 사용하는 것을 잊었을 때 이것을 보았습니다. –