Эта проблема связана с моей плохой проектной конструкцией, отсутствием знаний о том, как использовать 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. Благодаря!
Рад, что все работает! –