2013-05-14 59 views
2

考虑以下简化域:预先加载一个可选一到一个与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存在(即我们不知道细节它)。

我们的数据库已经为MovieId列一个单独的表,和MovieDetail与列IdMovieId一个单独的表。还有一个从MovieDetail.MovieIdMovie.Id的外键。我们已经将这一切都映射到了NHibernate中,但是当获得Movie实例的集合时,我们需要一个包含MovieDetail的左外连接。如果不是这样,那么迭代Movie实例时可能会出现N + 1问题。现在就是这种情况:每次调用Movie.MovieDetail属性都有一个单独的查询。

我试过one-to-one映射,但似乎是当你有两个实例的情况下。在我们的案例中,我们并不总是有一个MovieDetail。此外,他们不共享相同的主键。

我研究过公式,但那需要我让我的MovieDetail实现IUserType,基本上把NHibernate放到我的域中。我想避免这种情况。

回答

0

也许你可以尝试在MovieMovieDetail的映射中添加多对一的关系,它将作为一对一的映射。

当您将选项'not-null'设置为“false”时,我认为它也是可以为空的。 我不知道你是否懒惰加载或没有,当这是如此MovieDetail加载需要时,而不是左连接构造。

不是所有的属性在两个类中都是虚拟的吗?

<many-to-one name="MovieDetail" column="Id" class="MovieDetail" not-null="false" lazy="false"/> 
+0

我无法让它工作。可能的话,我们的领域有些异域风情(我简化了它)。属性应该是虚拟的(他们是)。 – Peter 2013-05-15 07:39:44

0

我是有点着急的,我不知道你是否能修改域/ DB模式,但你可能会想尝试看看http://ayende.com/blog/3937/nhibernate-mapping-component

在我看来,Movie最多只能有一个MovieDetail,它可能不在那里。 MovieDetail可能有像Description,ReleaseDate,Actors等属性我不明白你为什么分开这些概念。通过将它们放在一起,每次您想列出电影时,您都可以减少1张桌子和1张FK。

该组件允许您将数据隔离到单独的实体中,同时映射到与Movie相同的表。

+0

那是一个简化的域/模式。真实的事情有它的理由,但是我简化了/将它简化了。 – Peter 2013-08-21 12:20:43

相关问题