2011-07-24 198 views
0

我无法弄清楚如何让我正确的映射与NHibernate 3.0NHibernate的映射问题

我有两个波苏斯:

public class Account 
{ 
    public virtual string AccountNumber { get; set; } 

    public virtual IList<AccountSummary> AccountSummaries { get; set; } 
} 

public class AccountSummary 
{ 
    public virtual uint Id { get; protected set; } 

    public virtual string AccountNumber { get; set; } 

    public virtual DateTime TradeDate { get; set; } 
} 

我想在班这样的表映射:

表:账户(柱:ACCOUNT_NUMBER)

表:account_summaries(柱:ID,柱:trade_date,柱:ACCOUNT_NUMBER)

如何避免在AccountSummary类中拥有Account对象,因为我通常会使用一对多/多对一映射。而不是我的AccountSummary类具有Account对象,我希望AccountSummary类具有Account类的属性,就像类定义中的AccountNumber属性一样,并引用了Account类。

我还想将trade_date和account_number列映射为natural-id或unique-key。

我的映射是这样的:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
          assembly="FundAccountDBExperiment" 
          namespace="FundAccountDBExperiment.Models"> 
    <class name="Account" table="accounts"> 
    <composite-id> 
     <key-property name="AccountNumber" column="account_number" length="40"/> 
    </composite-id> 
    <bag name="AccountSummaries" table="account_summaries" cascade="all-delete-orphan" inverse="true"> 
     <key column="account_number"/> 
     <one-to-many class="AccountSummary"/> 
    </bag> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
          assembly="FundAccountDBExperiment" 
          namespace="FundAccountDBExperiment.Models"> 
    <class name="AccountSummary" table="account_summaries"> 
    <id name="Id" column="id"> 
     <generator class="native"/> 
    </id> 
    <property name="TradeDate" column="trade_date" type="date" not-null="true"/> 
    <join table="account"> 
     <key column="acount_number"/> 
    </join> 
    </class> 
</hibernate-mapping> 

任何形式的帮助,将不胜感激。

+0

广东话你AccountSummary的映射下,作为acount_number一个简单的财产? – sternr

+1

为什么你想“避免在AccountSummary类中拥有Account对象”呢?你试图解决什么是真正的问题? – Wolfgang

+0

如果我将Account映射为AccountSummary类中的对象,则需要重构代码。我更喜欢让AccountSummary类具有一个AccountNumber字符串属性,这意味着不需要重构。 – Filip

回答

1

这不就够了吗?

public class AccountSummary 
{ 
    public virtual uint Id { get; protected set; } 

    public virtual Account Account { get; set; } 

    public virtual string AccountNumber 
    { 
     get { return Account.AccountNumber; } 
     set { Account.AccountNumber = value; } 
    } 

    public virtual DateTime TradeDate { get; set; } 
} 

和唯一约束见 “myUniqueIndex”

<class name="AccountSummary" table="account_summaries"> 
    <id name="Id" column="id"> 
     <generator class="native"/> 
    </id> 
    <property name="TradeDate" column="trade_date" type="date" not-null="true" index="myUniqueIndex" /> 
    <many-to-one column="acount_number" lazy="false" index="myUniqueIndex"> 
    </class> 

希望这有助于

+0

感谢Firo。这就是我一直在寻找的。我试图在一个类的属性上设置父子关系,而不是类本身。我仍然不确定它是否可能,即在AccountSummary类中没有Account对象的情况下设置上述关系。我想这就是为什么它叫做对象关系映射器,而不是属性关系映射器? – Filip

+0

海事组织不是(优雅)的可能。但上述应该更具灵活性。您可以访问帐户并且不需要重构,但是当您扩展帐户时,AccountSummary不必更改 – Firo