nHibernate按id设置引用的属性

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

我有以下从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);
        }

        ...
    }
正如您所看到的,我的时间记录引用了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()