我的ASP.NET MVC 4項目使用NHibernate(位於倉庫後面)和Castle Windsor,使用AutoTx和NHibernate Facilities。我遵循haf編寫的指南,我可以創建和讀取對象。NHibernate不堅持更改我的對象
我PersistenceInstaller看起來像這樣
public class PersistenceInstaller : IWindsorInstaller
{
public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
{
container.AddFacility<AutoTxFacility>();
container.Register(Component.For<INHibernateInstaller>().ImplementedBy<NHibernateInstaller>().LifeStyle.Singleton);
container.AddFacility<NHibernateFacility>(
f => f.DefaultLifeStyle = DefaultSessionLifeStyleOption.SessionPerWebRequest);
}
}
的NHibernateInstaller是直接從NHib Facility Quickstart。
我在我的基地倉庫使用ISessionManager ...
protected ISession Session
{
get
{
return _sessionManager.OpenSession();
}
}
public virtual T Commit(T entity)
{
Session.SaveOrUpdate(entity);
return entity;
}
最後,這是造成這個問題我的應用程序代碼:測試
[HttpPost]
[ValidateAntiForgeryToken]
[Transaction]
public ActionResult Maintain(PrescriberMaintainViewModel viewModel)
{
if (ModelState.IsValid)
{
var prescriber = UserRepository.GetPrescriber(User.Identity.Name);
//var prescriber = new Prescriber { DateJoined = DateTime.Today, Username = "Test" };
prescriber.SecurityQuestion = viewModel.SecurityQuestion;
prescriber.SecurityAnswer = viewModel.SecurityAnswer;
prescriber.EmailAddress = viewModel.Email;
prescriber.FirstName = viewModel.FirstName;
prescriber.LastName = viewModel.LastName;
prescriber.Address = new Address
{
Address1 = viewModel.AddressLine1,
Address2 = viewModel.AddressLine2,
Address3 = viewModel.AddressLine3,
Suburb = viewModel.Suburb,
State = viewModel.State,
Postcode = viewModel.Postcode,
Country = string.Empty
};
prescriber.MobileNumber = viewModel.MobileNumber;
prescriber.PhoneNumber = viewModel.PhoneNumber;
prescriber.DateOfBirth = viewModel.DateOfBirth;
prescriber.AHPRANumber = viewModel.AhpraNumber;
prescriber.ClinicName = viewModel.ClinicName;
prescriber.ClinicWebUrl = viewModel.ClinicWebUrl;
prescriber.Qualifications = viewModel.Qualifications;
prescriber.JobTitle = viewModel.JobTitle;
UserRepository.Commit(prescriber);
}
return View(viewModel);
}
上面的代碼將保存一個新的處方(通過取消註釋掉的註釋等)。
我正在使用NHProf並已確認沒有將sql發送到數據庫以進行更新。我可以看到正在執行的讀取,但就是這樣。
在我看來,NHibernate不承認實體被更改,因此不會生成SQL。或者可能交易沒有被提交?
我一直在網上衝刷了幾個小時,現在試圖完成這一個,並作爲絕望的最後一幕在SO上發佈。有任何想法嗎? :)
哦,在NHProf中,我看到三個會話(1爲來自回購的GetPrescriber調用,我假設用於更新(沒有sql) - 一個用於我在基類的actionfilter中的某個動作)。我也收到關於使用隱式事務的警報。這讓我感到困惑,因爲我認爲我正在做我需要的所有事情 - 使用AutoTx和Transaction屬性。根據我的Windsor配置,我也預計每個webrequest只有一個會話。
更新:看來,花費了閱讀NHibernateFacility和AutoTx Facility的源代碼進行自動事務處理的一天之後,AutoTx沒有在我的INHibernateInstaller實現上設置攔截器。這似乎意味着每當SessionManager調用OpenSession時,它都會調用不帶參數的默認版本,而不是接受Interceptor的版本。內部AutoTxFacility註冊TransactionInterceptor與溫莎,以便它可以添加攔截我INHibernateInstaller混凝土,由溫莎利用的AutoTx的TransactionalComponentInspector的
AutoTxFacility source on github
是否有錯誤信息?或者只是沒有改變持續? –
沒有錯誤消息。只是沒有數據庫的SQL。我假設我做錯了什麼,我只是不知道我做錯了什麼 –