nhibernate - 禁用一对多关系的子记录的自动\延迟加载

dot*_*der 9 nhibernate

我想知道是否有办法在nHibernate中禁用子记录的自动加载(对于一个:许多关系).

我们可以轻松地关闭属性上的延迟加载,但我想要的是禁用任何类型的自动加载(懒惰和非懒惰).我只想通过查询加载数据(即HQL或Criteria)

我仍然希望在映射文件中定义父子记录之间的关系以促进HQL并能够加入父子实体,但我不希望子记录作为父记录的一部分加载,除非查询父记录明确指出(通过急切获取等).

示例:从数据库中获取部门记录不应从数据库中获取所有员工记录,因为可能永远不需要它.

这里的一个选项是将Department上的Employees集合设置为延迟加载.这种方法的问题在于,一旦将对象提供给调用API,它就可以"触摸"延迟加载属性,并从db中获取整个列表.

我试图使用'evict' - 断开对象,但它似乎并不总是在工作,并且不会对对象进行深度驱逐.另外,它使用代理类抽象延迟加载的属性类型,该代理类稍后在代码中播放,我们尝试通过反射对对象进行操作,并且在对象上遇到未消除的类型.

我是nHibernate的初学者,任何指针或帮助都会有很大的帮助.

Dav*_*emp 3

根据您的请求,您可能根本无法从“部门”映射到“员工”,也无法在您的部门中拥有“员工”属性。这意味着您始终必须访问数据库才能找到数据库的员工。

如果这些代码示例不能开箱即用,我深表歉意,因为我目前还没有靠近编译器

因此,您的部门课程可能如下所示:

 public class Department 
 { 
     public int Id { get; protected set; }
     public string Name { get; set; }
     /* Equality and GetHashCode here */
 }
Run Code Online (Sandbox Code Playgroud)

你的员工看起来像:

 public class Employee
 { 
     public int Id { get; protected set; }
     public Name Name { get; set; }
     public Department Department { get; set; }
     /* Equality and GetHashCode here */
 }
Run Code Online (Sandbox Code Playgroud)

任何时候您想为某个部门寻找员工,您都必须致电:

/*...*/
session.CreateCriteria(typeof(Employee))
    .Add(Restrictions.Eq("Department", department)
    .List<Employee>();
Run Code Online (Sandbox Code Playgroud)

仅仅因为您的规范说“部门有许多员工”,并不意味着您必须将其映射为双向关联。如果您可以保持关联的单向性,那么您也可以真正实现数据访问。

Google “领域驱动设计”聚合,或参阅 Eric Evan 的领域驱动设计书籍第 125 页以获取更多信息