考虑以下简化域:
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表和一个MovieDetail表,前者包含列Id,后者包含列Id和MovieId。还有一个从MovieDetail.MovieId到Movie.Id的外键。
我们已经将这些都映射到了NHibernate中,但是当获取Movie实例的集合时,我们需要一个与MovieDetail的左外部连接。如果不是这样,我们在迭代Movie实例时可能会遇到N+1问题。现在的情况就是这样:每个对Movie.MovieDetail属性的调用都有一个单独的查询。
我尝试过one-to-one映射,但这似乎适用于同时拥有两个实例的情况。在我们的例子中,我们并不总是有一个MovieDetail。而且,它们不共享相同的主键。
我研究了公式的,但这需要我让我的MovieDetail实现IUserType,实质上是将NHibernate放入我的域中。我想避免这种情况。
发布于 2013-05-15 00:25:36
也许您可以尝试在到MovieDetail的Movie映射中添加多对一关系,它将充当一对一映射。
当您将选项'not-null‘设置为"false“时,我想它也可以为空。我不知道你是不是在偷懒加载,什么时候MovieDetail是在需要的时候加载的,而不是由左连接结构加载的。
两个类中的所有属性不都应该是虚拟的吗?
<many-to-one name="MovieDetail" column="Id" class="MovieDetail" not-null="false" lazy="false"/>发布于 2013-08-21 20:04:26
我有点着急,我不知道你是否可以修改你的域/数据库模式,但你可能想试着看看http://ayende.com/blog/3937/nhibernate-mapping-component。
在我看来,一个Movie最多只能有一个可能不存在的MovieDetail。MovieDetail可能有Description、ReleaseDate、Actors等属性,我真的不明白你为什么要把这些概念分开。通过将它们放在一起,每次您想要列出电影时,您将减少1个表和1个要加入的FK。
该组件允许您将数据隔离到单独的实体中,同时映射到与Movie相同的表。
https://stackoverflow.com/questions/16546200
复制相似问题