我已经构建了我的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 };
有没有另一种方法可以实现我想要做的事情而不需要为实体访问数据库?
我应该咬紧牙关并映射外键以及关系吗?
或者我是否担心数据库出现问题,我应该坚持下去吗?
答案 0 :(得分:3)
你是正确的避免映射FK Id,以避免3次附加旅行: -
var thing = new Thing {
Stuff = session.Load<Stuff>(20),
What = session.Load<What>(21),
Blah = session.Load<Blah>(2234),
}
session.Load
与session.Get
同样值得注意的是Thing.Stuff.Id
也没有命中数据库。
这是great post,我引用: -
在session.load()中,Hibernate不会命中数据库(没有选择 输出中的语句)检索Stock对象,它将返回一个 股票代理对象 - 具有给定标识值的虚假对象。在这 方案,代理对象足以保存股票交易 记录。