nHibernate按id设置引用的属性
我有以下从Ajax调用的方法:nHibernate按id设置引用的属性,nhibernate,fluent-nhibernate,nhibernate-criteria,Nhibernate,Fluent Nhibernate,Nhibernate Criteria,我有以下从Ajax调用的方法: [Authorize] [ValidateInput(false)] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public JsonNetResult CreateOrUpdateTimeRecord(TimeRecord tr) { TimeRecord trLocal; if (tr.Id == -1 || tr.Id == 0
[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);
}
...
}
正如您所看到的,我的时间记录引用了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,并在需要时加载其余的ID。我是否必须将此“新”项目附加到我的会话中?
有人能告诉我做这件事的正确方法吗
干杯,
Stefan有几种方法可以实现这一点。其中一个可能是使用
Load()
方法。查看Ayendes post:,摘录:
Load永远不会返回null。它将始终返回实体或引发异常。因为这是我们与它签订的合同,当您调用它时,允许加载不命中数据库,因此可以自由返回代理
换句话说,我们可以这样做
User = _userRepo.Load(tr.User.Id),
Hdt = _hdtRepo.Load(tr.Hdt.Id)
其中,Load
将封装session.Load()