2012-01-19 104 views
1

我期待在那裏你有一個對象做到以下幾點,想象一個場景:NHibernate映射對象到多個表使用相同的ID?

public class ObjectA { 
    public virtual Guid Id; 
    public virtual string PropertyA; 
    public virtual string PropertyB; 
    public virtual string PropertyC; 
    public virtual string PropertyD; 
} 

而對於原因,我不會進入,數據庫需要看起來像這樣:

---- 
Table: ObjectABase 
---- 
Column Id 
Column PropertyA 
Column PropertyB 
---- 

---- 
Table: ObjectAExtended 
---- 
Column Id 
Column PropertyC 
Column PropertyD 
---- 

對象是兩個表之間的分裂,是由同一個ID引用,所以當你調用Session.Save(...它會保存到兩個表。

任何人任何想法如何做到這一點,或者如果它甚至可能嗎?

乾杯。

編輯:我已經找到了答案,但不能將它張貼另一個7小時明顯。明天會更新。

+0

試試這個:http://stackoverflow.com/questions/1345125/nhibernate-domain-object-spans-multiple-tables – Oxonhammer

回答

1

一種可能性是在NHibernate的映射使用一個連接子類元素。你可以躺在你的目的如下:

public class ObjectABase 
{ 
    public virtual int Id {get; set;} 
    public virtual string PropertyA {get; set} 
    public virtual string PropertyB {get; set} 
} 

public class ObjectA : ObjectABase 
{ 
    public virtual string PropertyC {get; set} 
    public virtual string PropertyD {get; set}  
} 

,然後你可以建立一個映射如下:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="Company.DomainModel"> 
    <joined-subclass name="ObjectA" table="ObjectAExtended" extends="Company.DomainModel.ObjectABase" lazy="false"> 
    <key column="Id" /> 
    <property name="PropertyC" /> 
    <property name="PropertyD" /> 
    </joined-subclass> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Company.DomainModel" assembly="DomainModel"> 
    <class name="ObjectABase" table="ObjectABase" lazy="false"> 
    <id name="Id" column="Id"> 
     <generator class="identity"/> 
    </id> 
    <property name="PropertyA" /> 
    <property name="PropertyB" /> 
    </class> 
</hibernate-mapping> 

通過關閉延遲加載,你可以在一杆得到一切從數據庫。

這是不是你在你的問題規定到底是什麼,因爲對象A的屬性都在對象A和繼承的基礎對象的定義,但有可能不是你的應用的實際的差異。

2

我想通了。在NHibernate的3.2使用地圖通過代碼...

public class ObjectAMap : ClassMapping<ObjectA> { 
    public ObjectAMap() { 
     Table("ObjectABase"); 
     Id<Guid>(x => x.Id, m => { m.Column("Id"); }); 
     Property(x => x.PropertyA, map => { map.Column("PropertyA"); }); 
     Property(x => x.PropertyB, map => { map.Column("PropertyB"); }); 
     Join("ObjectA", 
      m => { 
       m.Table("ObjectAExtended"); 
       m.Key(x => { x.Column("Id"); }); 
       m.Property<string>(x => x.PropertyC, map => { map.Column("PropertyC"); }); 
       m.Property<string>(x => x.PropertyD, map => { map.Column("PropertyD"); }); 
      }); 

     }); 
    } 
} 
+0

它工作正常,我。 –

相關問題