首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >渴望使用NHibernate加载可选的一对一服务

渴望使用NHibernate加载可选的一对一服务
EN

Stack Overflow用户
提问于 2013-05-14 22:42:31
回答 2查看 799关注 0票数 2

考虑以下简化域:

代码语言:javascript
运行
复制
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,后者包含列IdMovieId。还有一个从MovieDetail.MovieIdMovie.Id的外键。

我们已经将这些都映射到了NHibernate中,但是当获取Movie实例的集合时,我们需要一个与MovieDetail的左外部连接。如果不是这样,我们在迭代Movie实例时可能会遇到N+1问题。现在的情况就是这样:每个对Movie.MovieDetail属性的调用都有一个单独的查询。

我尝试过one-to-one映射,但这似乎适用于同时拥有两个实例的情况。在我们的例子中,我们并不总是有一个MovieDetail。而且,它们不共享相同的主键。

我研究了公式的,但这需要我让我的MovieDetail实现IUserType,实质上是将NHibernate放入我的域中。我想避免这种情况。

EN

回答 2

Stack Overflow用户

发布于 2013-05-15 00:25:36

也许您可以尝试在到MovieDetailMovie映射中添加多对一关系,它将充当一对一映射。

当您将选项'not-null‘设置为"false“时,我想它也可以为空。我不知道你是不是在偷懒加载,什么时候MovieDetail是在需要的时候加载的,而不是由左连接结构加载的。

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

代码语言:javascript
运行
复制
<many-to-one name="MovieDetail" column="Id" class="MovieDetail" not-null="false" lazy="false"/>
票数 0
EN

Stack Overflow用户

发布于 2013-08-21 20:04:26

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

在我看来,一个Movie最多只能有一个可能不存在的MovieDetailMovieDetail可能有DescriptionReleaseDateActors等属性,我真的不明白你为什么要把这些概念分开。通过将它们放在一起,每次您想要列出电影时,您将减少1个表和1个要加入的FK。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16546200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档