2009-04-21 55 views
2

我想通过映射将对象的集合到父对象中。获取没有主键的子项NHibernate

我有一个父对象“ScoreCard”,其主键是一个GUID(ID)和一个孩子“Score”对象,其主键是一个GUID(ID)。我想选择基于两个字段父的子对象,这两个对象有,但我不能让它工作,这里的映射

<bag name="ScoreCard"> 
    <key> 
    <column name="HoleId"/> 
    <column name="PlayerId"/> 
    </key> 
    <one-to-many class="Score" not-found="ignore"/> 
</bag> 

我没有设计的数据库,但记分卡对象来从一个视图返回列我需要加上邪恶的指导。无论我尝试过什么,NHibernate都会抛出关于与外键不一样的外键的异常。

这对我来说似乎是最简单的要求,得到了一些标准的东西的集合,为什么我这么卡住?

感谢您的帮助,对于不好的示例代码(在亲戚家中潜意识看高尔夫球)感到抱歉。

回答

3

嗯,我最终发现它。父对象是从给出三列而没有键的视图中绘制的。我可以将复合键映射到HoleId和PlayerId,而不是我在查看代码时找到的邪恶GUID。这很好,因为我可以轻松映射我需要的Score对象,然后使用NHibernateUtil.Initialize延迟加载它们。

我的XML映射需要像这样

<class name="ParentObject"> 
    <composite-id> 
     <key-property name="HoleId" column="HoleId" /> 
     <key-property name="PlayerId" column="PlayerId" />  
    </composite-id> 
    <property name="EvilGuid" column="Id" /> 
    <bag name="ScoreCard"> 
     <key> 
     <column name="HoleId"/> 
     <column name="PlayerId"/> 
     </key> 
     <one-to-many class="Score" not-found="ignore"/> 
    </bag> 
</class> 

我得到了我的灵感来自this post,还请注意Stefan的回答,因为我觉得我在这里度过了一个幸运符,以及设计可以变得更好更多关于DDD的想法。

感谢您的帮助。

1

问题是这样的:NHibernate最好(但不仅仅是)为DDD,这意味着首先创建域类,并使数据库最适合域模型。

您有与非主键字段的复合ID关系。所以开始祈祷NHibernate可以应付这个问题。对于传统数据库,支持复合ID和非主键关系,并且通常不鼓励DDD。

我认为两者的结合不起作用。在NHibernates问题追踪器上查看此问题: https://nhibernate.jira.com/browse/NH-1722。您可以为该功能投票。

+0

谢谢,我有一个复合键的复合外键的例子,但我可以看到它是我需要的属性ref。 ORM规定数据库的设计似乎很难,但我可以看到你关于DDD的观点,所以我可能会考虑重新设计,而我仍然有机会。 – 2009-04-22 08:17:06

+0

NHibernate试图尽可能少地指定领域模型,并做得很好(至少比其他选择更好)。通过支持各种关系模型,它可能只占90%左右。以任何列值链接行很少见,难以映射到类模型。关系模型更加灵活。 – 2009-04-22 08:42:19