考虑以下简化域:预先加载一个可选一到一个与NHibernate
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; }
}
一个MovieDetail
不可能存在没有Movie
,但Movie
可能没有MovieDetail
存在(即我们不知道细节它)。
我们的数据库已经为Movie
与Id
列一个单独的表,和MovieDetail
与列Id
和MovieId
一个单独的表。还有一个从MovieDetail.MovieId
到Movie.Id
的外键。我们已经将这一切都映射到了NHibernate中,但是当获得Movie
实例的集合时,我们需要一个包含MovieDetail
的左外连接。如果不是这样,那么迭代Movie
实例时可能会出现N + 1问题。现在就是这种情况:每次调用Movie.MovieDetail
属性都有一个单独的查询。
我试过one-to-one
映射,但似乎是当你有两个实例的情况下。在我们的案例中,我们并不总是有一个MovieDetail
。此外,他们不共享相同的主键。
我研究过公式,但那需要我让我的MovieDetail
实现IUserType
,基本上把NHibernate放到我的域中。我想避免这种情况。
我无法让它工作。可能的话,我们的领域有些异域风情(我简化了它)。属性应该是虚拟的(他们是)。 – Peter 2013-05-15 07:39:44