1

我已经构建了我的 NHibernate 模型来隐藏外键 ID,这似乎是最佳实践,所以不要同时像这样建模关系和键:

public class CompanyOffice
{
    public virtual int Id { get; set; }
    public virtual int CompanyId { get; set; }
    public virtual Company Company { get; set; }
}

我只是有:

public class CompanyOffice
{
    public virtual int Id { get; set; }
    public virtual Company Company { get; set; }
}

让 NHibernate 负责其余的工作。我喜欢这个,但我有几个表需要设置多个外键,当我创建一个新实体时,在 MVC 操作中,我必须这样做:

public ActionResult CreateNewThing(int stuffId, int whatId, int blahId)
{
    var stuff = _service.GetStuffById(stuffId);
    var what = _service.GetWhatById(whatId);
    var blah = _service.GetBlahById(blahId);

    var thing = new Thing { Stuff = stuff, What = what, Blah = blah };
}

这意味着我需要三次访问数据库来获取实体,因为我已经有了 ID 并且可能已经完成了:

var thing = new Thing { StuffId = stuffId, WhatId = whatId, BlahId = blahId };

是否有另一种方法可以在不访问实体数据库的情况下实现我想要做的事情?
我应该咬紧牙关并映射外键以及关系吗?
还是我担心数据库旅行,我应该继续努力吗?

4

1 回答 1

3

避免映射 FK Id 是正确的,为了避免 3 次额外的行程,请执行以下操作:-

var thing = new Thing {
  Stuff = session.Load<Stuff>(20),
  What = session.Load<What>(21),
  Blah = session.Load<Blah>(2234),
}

session.Loadsession.Get

另外值得注意的是Thing.Stuff.Id也没有命中数据库。

这是一个很棒的帖子,我引用:-

在 session.load() 中,Hibernate 不会访问数据库(输出中没有 select 语句)来检索 Stock 对象,它会返回一个 Stock 代理对象——一个具有给定标识值的假对象。在这种情况下,一个代理对象就足以保存一个股票交易记录。

于 2013-06-03T12:22:02.940 回答