2012-03-13 5 views
0

Эта проблема связана с моей плохой проектной конструкцией, отсутствием знаний о том, как использовать nhibernate, или и тем, и другим (просто примечание, я обвиняю nhibernate для моего плохого проекта). Вот оно:Nhibernate mapping/design issue

В моей модели домена я следующее (я вырезал много лишнего, чтобы держать вещи простыми):

Объект события:

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; } 
    } 
} 

И Invitee Объект:

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. Тот же самый человек может добавить неограниченное количество приглашенных, которые затем добавляются в список приглашенных в объекте Invite, который был добавлен только к событию. Причина этого в том, что мне нужно отслеживать не только тех, кто был добавлен в мероприятие, но и того, кто добавил кого.

Моя проблема заключается в следующем: при сохранении события EventID добавляется в соответствующий столбец в db для каждого приглашенного, присутствующего в списке приглашенных участников (в таблице приглашений db). Кроме того, если приглашенный в этом списке Event.Invitees приглашает друзей (и, следовательно, добавляет приглашенных в свой собственный список Invite.Invitees), сохранение события будет правильно записывать приглашенный адрес приглашенного, который пригласил всех приглашенных, которых он пригласил (также в таблице db Invite.com). ПРОБЛЕМА: EventID не добавляется к ребенку. Приглашения всех приглашенных в списке Event.Invitees.

Бог ... Я делаю ужасную работу, объясняя это, и прошу прощения. Здесь я могу предоставить неограниченные данные, но я не хочу перегружать этот пост. Скажите, пожалуйста, если вам нужно что-нибудь еще, чтобы помочь мне решить эту проблему.

Несмотря на это, здесь соответствующие части файлов отображения событий и INVITEE:

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> 

ОБНОВЛЕНИЕ @ Роберто Эрнандес - Во-первых, спасибо, что ответили. Я очень, очень ценю это.

Во-вторых, взял на себя инициативу и провел тест, используя только мои DAL и DOs, и это сработало. Так ясно, что что-то не так с функциями, которые преобразуют мои ДО в BOs.

Есть еще кое-что, что я сделал не так, как вы указали. Я добавил приглашенного ребенка к приглашенному родительскому объекту и приглашаюшему родителя к событию.Invitees. Затем я предположил, что сохранение события затем выполнит всю необходимую настойчивость, в том числе для приглашенных детей. Очевидно, я был неправ, и мне также нужно было добавить 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. Например, добавление метода AddInvitee к классу Event, который обрабатывает параметры свойств в дочернем объекте.

ВНИМАНИЕ: У вас, кажется, есть слой сопоставления, который вы не показываете нам, который обрабатывает отображение из BO в DO, я ответил наилучшим образом, не зная, что у вас на этом слое.

Смежные вопросы