2012-03-13 137 views
0

這個問題要麼是由於我的項目設計不佳,我缺乏關於如何使用nhibernate的知識,或者兩者兼而有之(只是說明,我爲我的糟糕的項目設計指責nhibernate)。那就是:Nhibernate映射/設計問題

在我的域模型,我有以下的(我剪了很多多餘的讓事情變得簡單的):

的Event對象:

public class EventBO 
{ 

    public int ID { get; set; } 

    public String Name 
    { 
     get; 
     set; 
    } 

    private List<InviteeBO> _invitees = null; 

    public List<InviteeBO> Invitees 
    { 
     get { return _invitees; } 
     set { _invitees = value; } 
    } 
} 

而一個被邀請對象:

public class InviteeBO 
{ 

    public int ID { get; set; } 

    public String Name 
    { 
     get; 
     set; 
    } 

    private List<InviteeBO> _invitees = null; 

    public List<InviteeBO> Invitees 
    { 
     get { return _invitees; } 
     set { _invitees = value; } 
    } 

    private EventBO theEvent; 

    public EventBO TheEvent 
    { 
     get { return theEvent; } 
     set { theEvent = value; } 
    } 

    private InviteeBO invitedByUser = null; 

    public InviteeBO InvitedByUser 
    { 
     get { return invitedByUser; } 
     set { invitedByUser = value; } 
    } 
} 

創建事件時,創建事件的人自動添加到Event.Invitees列表中。然後,同一個人可以添加無限量的被邀請者,然後將其添加到剛剛添加到事件的受邀者對象中的受邀者列表。原因是因爲我需要不僅追蹤誰加入了賽事,而且還追蹤誰加入了誰。

我的問題是這樣的:當我保存一個事件時,事件的被邀請者列表中的每個被邀請者(在被邀請者數據庫表中),EventID被添加到數據庫的相應列中。此外,如果該Event.Invitees列表中的Invitee邀請好友(並因此將邀請者添加到其自己的Invitee.Invitees列表中),則保存事件將正確地寫入邀請對象,邀請者邀請他邀請的所有被邀請者也在Invitee數據庫表中)。問題:EventID未被添加到Event.Invitees列表中的所有被邀請者的被邀請者。

上帝......我正在做一個可怕的工作來解釋這個,我很抱歉。我可以在這裏提供無限的細節,但我不想超載這篇文章。請告訴我你是否需要其他任何東西來幫助我解決這個問題。

無論如何,這裏的事件和被邀請者映射文件的相關部分:

Event.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="DAL" 
        namespace="DAL.DAO.Entities"> 
    <class name="EventDO" table="Events"> 
    <id name="ID"> 
     <column name="ID"/> 
     <generator class="native" /> 
    </id> 
    <property name="Name"> 
     <column name="Name"/> 
    </property> 
    <property name="Description"> 
     <column name="Description"/> 
    </property>  
    <bag name="Invitees" table="Invitees" inverse="false" cascade="all" lazy="false" > 
     <key column="EventID"/> 
     <one-to-many class="InviteeDO" /> 
    </bag> 

    </class> 
</hibernate-mapping> 

Invitee.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DAL" namespace="DAL.DAO.Entities" > 
    <class name="InviteeDO" table="Invitees"> 
    <id name="ID"> 
     <generator class="identity"/> 
    </id> 
     <property name="FullName"/> 
     <many-to-one name="TheEvent" cascade="none" column="EventID" lazy="false" /> 
     <bag name="Contacts" table="Contacts" inverse="false" cascade="all" lazy="false" > 
     <key column="ContactOfUserID"/> 
     <one-to-many class="ContactDO" /> 
     </bag> 
     <bag name="Invitees" table="Invitees" inverse="false" cascade="save-update" lazy="false" > 
     <key column="InvitedByID" /> 
     <one-to-many class="InviteeDO"/> 
     </bag> 
     <property name="IsOrganizer"/> 
     <property name="IsCreator"/> 


    </class> 
</hibernate-mapping> 

更新 @Roberto埃爾南德斯 - 首先,感謝您的迴應。我真的很感激它。

其次,您只需使用我的DAL和DOs進行測試,然後運行。所以很顯然,將我的DOs轉換爲BOs的功能出了問題。

還有一些我做錯了,你指出。我已將子受邀者添加到父邀請對象,並將父邀請對象添加到事件邀請對象。然後我推測,保存事件將執行所有必要的持續性,包括對於被邀請的子女。很明顯,我錯了,我還需要將parentInvitee添加到該子項,並將該子項添加到Event.Invitees。謝謝!

+0

很高興聽到一切正常! – 2012-03-13 18:15:08

回答

1

我不認爲上面列出的代碼有什麼特別的錯誤,我的意思是有一些可能的改進,但我認爲你主要假設NHibernate會做更多,目前正在爲你做。我使用你的代碼和映射構建了一個應用程序,並且只要我明確設置了上面提到的屬性,一切都按預期工作。以下是摘錄。

// This is my SessionFactory (Not Relevant!) 
using (var session = NhSessionFactory.GetSession(generatedatabase: false)) 
{ 
using (var tran = session.BeginTransaction()) 
{ 
    var theEvent = new EventBO(); 
    theEvent.Name = "EventName"; 

    var parentInvitee = new InviteeBO(); 
    parentInvitee.Name = "Parent"; 
    theEvent.Invitees.Add(parentInvitee); 

    for (int index = 0; index <= 5; index++) 
    { 
     var childInvitee = new InviteeBO(); 
     childInvitee.Name = string.Format("Child {0}", index); 
     childInvitee.InvitedByUser = parentInvitee; // Adding invited by user. 

     parentInvitee.Invitees.Add(childInvitee); 
     theEvent.Invitees.Add(childInvitee); // Adding child invitees to Event. 
    } 

    session.SaveOrUpdate(theEvent); 
    tran.Commit(); 
} 
} 

雖然上述工程的代碼,我會建議重構到您的BO對象這一切。例如,將AddInvitee方法添加到處理子對象中屬性設置的Event類。

警告:你似乎有你是不是向我們展示的是處理從BO映射到我回答我可以在最好的辦法不知道你有什麼在這層映射層。