2012-03-13 12 views
0

この問題は、貧弱なプロジェクトデザイン、nhibernateの使用方法の不足、またはその両方によるものです(貧弱なプロジェクト設計のためにnhibernateを非難しています)。ここでは、次のとおりです。Nhibernateマッピング/デザインの問題

イベントオブジェクト:

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リストに追加されます。その後、同一人物は無制限の招待状を追加することができ、招待状はイベントに追加されたばかりの招待者オブジェクト内の招待者リストに追加されます。これは、誰がイベントに追加されたのかだけでなく、誰が誰を追加したのかを把握する必要があるためです。

私の問題は次のとおりです。イベントを保存すると、(招待者のdbテーブルの)イベントの招待者リストにある各招待者のdbの各列にEventIDが追加されます。さらに、そのEvent.Inviteesリスト内の招待者が友人を招待し、招待者をInvitee.Inviteesリストに追加する場合、イベントを保存すると招待されたすべての招待者に招待を行った招待者のInviteeIDが正しく書き込まれます招待者のdbテーブルにも表示されます)。問題:EventIDは、Event.Inviteesリストのすべての招待者の子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> 

UPDATE @Roberto Hernandez - まずはお返事ありがとうございます。私は本当に、本当にそれを感謝します。

第2に、私のDALとDOだけを使用してテストを実行し、それが機能しました。だから明らかに私のDOをBOに変換する関数には何か問題があります。

私が間違っていたこともあり、あなたが指摘したことがあります。親の招待状に子の招待状を追加し、イベントの親の招待状を追加しました。私は、イベントを保存すると、子の招待者を含め、必要なすべての永続性を実行すると推測しました。明らかに私は間違っていました。また、parentInviteeを子に追加し、子をEvent.Inviteesに追加する必要がありました。ありがとう!

+0

すべてがうまくいっていることを聞いてうれしい! –

答えて

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オブジェクトにリファクタリングすることをおすすめします。たとえば、子オブジェクトのプロパティの設定を処理するEventクラスにAddInviteeメソッドを追加します。

警告:BOからDOへのマッピングを処理する私たちが表示していないマッピングレイヤーがあるようです。そのレイヤーの中に何があるのか​​分からずにできる限りの方法で答えました。