nHibernate通过id设置引用的属性

时间:2014-01-15 10:22:29

标签: 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)
        {
            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,并在需要时加载其余的代码。我是否必须将此“新”项目附加到我的会话中? 谁能告诉我这是怎么回事?

干杯, 斯蒂芬

1 个答案:

答案 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()