【发布时间】:2013-05-08 21:53:48
【问题描述】:
考虑以下简化域:
public class Movie
{
public virtual int Id { get; set; }
public virtual MovieDetail MovieDetail { get; set; }
}
public class MovieDetail
{
public virtual int Id { get; set; }
public virtual Movie Movie { get; set; }
}
没有Movie 就不能存在MovieDetail,但是没有MovieDetail 就可以存在Movie(即我们没有关于它的详细信息)。
我们的数据库为Movie 提供了一个单独的表,其中包含Id 列,以及一个用于MovieDetail 的单独表,其中包含Id 和MovieId 列。从MovieDetail.MovieId 到Movie.Id 还有一个外键。
我们已经在 NHibernate 中映射了这一切,但是当获取Movie 实例的集合时,我们需要与MovieDetail 进行左外连接。如果不是,我们在迭代 Movie 实例时可能会遇到 N+1 问题。现在就是这种情况:每次调用 Movie.MovieDetail 属性都有一个单独的查询。
我已经尝试过one-to-one 映射,但这似乎适用于同时拥有两个实例的情况。在我们的例子中,我们并不总是有MovieDetail。此外,它们不共享相同的主键。
我研究过公式,但这需要我让我的MovieDetail 实现IUserType,本质上是将 NHibernate 放入我的域中。我想避免这种情况。
【问题讨论】:
标签: nhibernate mapping one-to-one select-n-plus-1