我想知道是否有办法在nHibernate中禁用自动加载子记录(对于一个:多个关系)。
我们可以轻松地关闭属性上的延迟加载,但我想要的是禁用任何类型的自动加载(懒惰和非懒惰)。我只想通过查询加载数据(即HQL或Criteria)
我仍然希望在映射文件中定义父子记录之间的关系以便于HQL并能够加入父子实体,但我不希望子记录作为父记录的一部分加载,除非查询父记录 明确说明(通过急切获取等)。
实施例: 从数据库中获取部门记录不应该从数据库中获取所有员工记录,因为它可能永远不需要。
此处的一个选项是将Department上的Employees集合设置为延迟加载。这种方法的问题在于,一旦将对象提供给调用API,它就可以“触摸”延迟加载属性,并从db中获取整个列表。
我试图使用'evict' - 断开对象,但它似乎一直没有工作,并且不会对对象进行深度驱逐。 另外,它使用代理类抽象延迟加载的属性类型,该代理类稍后在代码中严重破坏,我们尝试通过反射对对象进行操作,并且在对象上遇到未消除的类型。
我是nHibernate的初学者,任何指针或帮助都会有很大的帮助。
答案 0 :(得分:3)
根据您的要求,您可能无法从部门映射到员工,也不会在部门中拥有Employees属性。这意味着总是必须使数据库命中才能找到数据库的员工。
Aplogies如果这些代码示例没有开箱即用,我现在不在编译器附近
因此,您的部门类可能如下所示:
public class Department
{
public int Id { get; protected set; }
public string Name { get; set; }
/* Equality and GetHashCode here */
}
并且您的员工看起来像:
public class Employee
{
public int Id { get; protected set; }
public Name Name { get; set; }
public Department Department { get; set; }
/* Equality and GetHashCode here */
}
如果您想为部门找到员工,您必须致电:
/*...*/
session.CreateCriteria(typeof(Employee))
.Add(Restrictions.Eq("Department", department)
.List<Employee>();
仅仅因为您的规范说“部门有很多员工”,并不意味着您必须将其映射为双向关联。如果您可以保持相关的单向,那么您也可以真正获得数据访问权限。
Google "Domain Driven Design" Aggregate,或参阅Eric Evan关于域驱动设计的书籍的第125页了解更多信息
答案 1 :(得分:-1)
您可以在集合中使用lazy属性。在您的示例中,Department有n名员工,如果启用了lazy,则在加载部门时默认情况下不会加载员工:http://www.nhforge.org/doc/nh/en/#collections-lazy
您可以拥有明确将部门和员工一起加载的查询。这是“获取”选项:http://www.nhforge.org/doc/nh/en/#performance-fetching-lazy