2009-02-08 135 views
1

我正在使用nhibernate映射旧数据库,并在映射关系时遇到了一些问题。使用外键映射一个到多个集合到外键

这两个类是这样

public class Questionnaire 
{ 
    public int Id {get; set;} 
    public string FormCode {get; set;} 
    public IList<Question> Questions {get; set;} 
} 

public class Question 
{ 
    public int Id{get; set;} 
    public Questionnaire Questionnaire {get;set;} 
    public string QuestionText{get;set;} 
} 

到都是这样

Questionnaire Table 
Id int 
FormCode varchar(100) 

Question Table 
Id int 
FormCode varchar(100) 
QuestionText varchar(max) 

两个表是所述formcode列之间的关系的表。

我当前的映射是这样的

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core"> 
<class name="Questionnaire" table="_questionnaire_list"> 
    <id column="Id" name="Id"> 
      <generator class="identity"/> 
    </id> 
     <property name="FormCode" column="FormCode"/> 
     <bag name="Questions" > 
      <key foreign-key="FormCode" property-ref="FormCode" /> 
      <one-to-many class="Question" />    
     </bag> 
</class> 
</hibernate-mapping> 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core"> 
<class name="Question" table="_questionnaire_items"> 
    <id column="ID" name="Id" unsaved-value="-1"> 
      <generator class="identity" /> 
     </id> 
     <property name="QuestionText" column="QuestionText" /> 
</class> 
</hibernate-mapping> 

当我运行的映射,我得到一个标识符类型不匹配假设它试图把formcode进入正题的ID。不幸的是,我无法改变表格的结构,我对如何绘制这张表格感到茫然,任何帮助都将不胜感激。

回答

4

你的关系是一个m:N的关系而没有中间实体。以这种方式定义m:n关系是一个典型的错误,因为它会删除一个pk端,这会导致出现两个表具有相同属性/字段的情况,并且它们碰巧在语义上表示相同的东西。但是,因为它们在双方都是非pk值,所以可能存在冗余和不准确性。你可以在两个字段上将两个表连接在一起,但在语义上它没有任何意义:对于实体模型将实体X关联到Y,FK端将关系的PK端作为FK字段获取,对于m:n关系,您需要来自中间实体的两个m:1关系。这是,没有例外。

所以,虽然要映射这一点,你提出的方式,它不能做的O/R映射器不能保证正确性,因为建议的关系简直是不正确的。

2

嗯,这是“问题”与奥姆斯。我说“问题”是因为Hibernate在技术上是正确的:外键应该是主键。但是,正如你所见证的那样,情况并非总是如此。

实际用于什么ID?如果没有,阻力最小的路径是使FormCode成为主键。这是一个选择吗?

如果没有,我真的不知道该怎么做以外的查询问题,而不是把他们当作孩子的实体。

+0

谢谢你的回复。我会回到客户端,看看我能否让他们改变他们的模式。再次感谢您的回复 – pythonandchips 2009-02-08 13:37:59

+0

请记住,您不一定必须更改模式。这可能足以告诉Hibernate PK是FormCode(即使它不是)。 – cletus 2009-02-08 13:57:57