2010-04-09 37 views
0

我正在自定义N2CMS的数据库结构,并遇到了一个问题。下面列出了这两个类。Nhibernate一对多每个子类都有表

public class Customer : ContentItem 
{ 
    public IList<License> Licenses { get; set; } 
} 

public class License : ContentItem 
{ 
    public Customer Customer { get; set; } 
} 

nhibernate映射如下。

<class name="N2.ContentItem,N2" table="n2item"> 
    <cache usage="read-write" /> 
    <id name="ID" column="ID" type="Int32" unsaved-value="0" access="property"> 
     <generator class="native" /> 
    </id> 
    <discriminator column="Type" type="String" /> 
    </class> 

    <subclass name="My.Customer,My" extends="N2.ContentItem,N2" discriminator-value="Customer"> 
    <join table="Customer"> 
     <key column="ItemID" /> 
     <bag name="Licenses" generic="true" inverse="true"> 
     <key column="CustomerID" /> 
     <one-to-many class="My.License,My"/> 
     </bag> 
    </join> 
    </subclass> 

    <subclass name="My.License,My" extends="N2.ContentItem,N2" discriminator-value="License"> 
    <join table="License" fetch="select"> 
     <key column="ItemID" /> 
     <many-to-one name="Customer" column="CustomerID" class="My.Customer,My" not-null="false" /> 
    </join> 
    </subclass> 

然后,当得到客户的情况下,customer.Licenses永远是空的,但实际上是在数据库中为客户许可证。当我检查了NHibernate的日志文件,我发现SQL查询是这样的:

SELECT licenses0_.CustomerID  as CustomerID1_, 
     licenses0_.ID    as ID1_, 
     licenses0_.ID    as ID2_0_, 
     licenses0_1_.CustomerID as CustomerID7_0_, 
FROM  n2item licenses0_ 
     inner join License licenses0_1_ 
      on licenses0_.ID = licenses0_1_.ItemID 
WHERE licenses0_.CustomerID = 12 /* @p0 */ 

看来,NHibernate的认为,在客户是在“n2item”表。我不知道为什么,但为了使它工作,我认为SQL应该是这样的。

SELECT licenses0_.ID    as ID1_, 
     licenses0_.ID    as ID2_0_, 
     licenses0_1_.CustomerID as CustomerID7_0_, 
FROM  n2item licenses0_ 
     inner join License licenses0_1_ 
      on licenses0_.ID = licenses0_1_.ItemID 
WHERE licenses0_1_.CustomerID = 12 /* @p0 */ 

难道有人指出我的映射有什么问题吗?我怎样才能获得一个客户的正确许可?提前致谢。

回答

0

我不确定SQL是否不正确,因为父类映射使用鉴别器,因此我期望所有属性都与基类(n2item)存储在同一个表中。然而,我不熟悉“连接表”语法,我通常使用连接子类,所以我可能会误解。

假设子类映射是正确的,那么许可证的问题可能与没有为该集合设置级联设置有关吗?

+0

感谢梅森,我想我应该坚持使用内置的n2数据库结构,因为定制的有很多问题。 – wenqiang 2010-04-12 09:41:29

+0

子类映射没有问题我添加了一对多元素。而且我已经尝试了一对多和包包元素上的几乎所有属性。没有用。 – wenqiang 2010-04-12 09:42:58

相关问题