我有以下从Ajax调用的方法:
[Authorize]
[ValidateInput(false)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public JsonNetResult CreateOrUpdateTimeRecord(TimeRecord tr)
{
TimeRecord trLocal;
if (tr.Id == -1 || tr.Id == 0)
{
trLocal = new TimeRecord
{
Description = tr.Description,
StartTime = tr.StartTime,
EndTime = tr.EndTime,
User =new myTimeMvc.Models.NHibernate.Models.User {Id = tr.User.Id},// _userRepo.Get(tr.User.Id),
Hdt = new Hdt {Id = tr.Hdt.Id}//_hdtRepo.Get(tr.Hdt.Id)
};
_timeRepo.Insert(trLocal);
}
else
{
trLocal = _timeRepo.Get(tr.Id);
trLocal.Description = tr.Description;
trLocal.StartTime = tr.StartTime;
trLocal.EndTime = tr.EndTime;
_timeRepo.Update(trLocal);
}
...
}
正如您所看到的,我的TimeRecord引用了User和Hdt。现在我开始使用NHibernate Profiler,当我通过从相应的存储库加载它们来解析我的属性时,它会抱怨。这对我来说很清楚,因为我实际上不需要查询数据库,因为我有这个对象的ID。
User = _userRepo.Get(tr.User.Id),
Hdt = _hdtRepo.Get(tr.Hdt.Id)
但我不能100%确定我是否可以使用它:
User =new myTimeMvc.Models.NHibernate.Models.User {Id = tr.User.Id},,
Hdt = new Hdt {Id = tr.Hdt.Id}
我认为NHibernate惰性代理的工作方式相同,因为它们只包含相关对象的ID,并在需要时加载其余的代码。我是否必须将此“新”项目附加到我的会话中? 谁能告诉我这是怎么回事?
干杯, 斯蒂芬
答案 0 :(得分:1)
如何实现这一目标有几种方法。其中一个可以使用 Load()
方法。检查Ayendes帖子:NHibernate – The difference between Get, Load and querying by id,摘录:
Load永远不会返回null。它将始终返回实体或抛出异常。因为这是我们拥有的合同,允许在您调用时不加载数据库,而是可以自由返回代理。
换句话说,我们可以做这样的事情
User = _userRepo.Load(tr.User.Id),
Hdt = _hdtRepo.Load(tr.Hdt.Id)
Load
将封装session.Load()