2009-10-10 52 views
2

我知道这已被要求,并回答了很多次不插入,但我有两个类多到很多。我已经用袋子来互相映射它们。这里是NHibernate的映射:NHibernate的许多一对多袋的关联表

日历:

<?xml version="1.0" encoding="utf-8"?> 
<!--Generated by NHibernate.Mapping.Attributes on 2009-10-09 18:09:29Z.--> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Calendar.Calendar, Calendar" table="Calendars"> 
    <id name="CalendarId" column="CalendarId" type="Int32"> 
     <generator class="native" /> 
    </id> 
    <property name="Name" length="100" /> 
    <property name="CalendarStatus" /> 
    <property name="CalendarType" type="Calendar.GenericEnumMapper`1[[Calendar.CalendarType, Calendar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Calendar" length="50" /> 
    <property name="RecordCreatedBy" column="CreatedBy" length="50" /> 
    <property name="RecordModifiedBy" column="ModifiedBy" length="50" /> 
    <property name="CreateDate" /> 
    <property name="ModifiedDate" /> 
    <bag name="Events" table="CalendarEventsInCalendar" cascade="all"> 
     <key column="CalendarId" /> 
     <many-to-many class="Calendar.CalendarEvent, Calendar" column="CalendarEventId" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

CalendarEvent:

<?xml version="1.0" encoding="utf-8"?> 
<!--Generated by NHibernate.Mapping.Attributes on 2009-10-09 18:27:46Z.--> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Calendar.CalendarEvent, Calendar" table="CalendarEvents"> 
    <id name="CalendarEventId" column="CalendarEventId" type="Int32"> 
     <generator class="native" /> 
    </id> 
    <property name="EventStatus" /> 
    <property name="StartTime" /> 
    <property name="EndTime" /> 
    <property name="ImageUrl" length="255" /> 
    <property name="Description" length="2000" /> 
    <property name="LocationName" length="255" /> 
    <property name="Address1" length="255" /> 
    <property name="Address2" length="255" /> 
    <property name="City" length="255" /> 
    <property name="State" length="255" /> 
    <property name="Zip" length="10" /> 
    <property name="Title" length="255" /> 
    <property name="Url" length="255" /> 
    <property name="ExternalSystemId" /> 
    <property name="ExternalSystem" type="Calendar.GenericEnumMapper`1[[Calendar.ExternalSystemType, Calendar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Calendar" length="50" /> 
    <property name="RecordCreatedBy" column="CreatedBy" length="50" /> 
    <property name="RecordModifiedBy" column="ModifiedBy" length="50" /> 
    <property name="CreateDate" /> 
    <property name="ModifiedDate" /> 
    <many-to-one name="ParentEvent" column="ParentEventId" /> 
    <bag name="ChildEvents" lazy="true" fetch="subselect" cascade="all" inverse="true"> 
     <key column="ParentEventId" /> 
     <one-to-many class="Calendar.CalendarEvent, Calendar" /> 
    </bag> 
    <bag name="Calendars" table="CalendarEventsInCalendar" lazy="false" inverse="true"> 
     <key column="CalendarEventId" /> 
     <many-to-many class="Calendar.Calendar, Calendar" column="CalendarId" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

这里就是我如何添加事件到日历:

public virtual void AddEvent(CalendarEvent calEvent) 
    { 
     if(!calEvent.Calendars.Contains(this)) 
      calEvent.Calendars.Add(this); 

     Events.Add(calEvent); 
    } 

然后我做了SaveOrUpdate(日历)

有什么想法?

回答

4

您必须包装在一个事务中SaveOrUpdate然后执行器transaction.commit()。否则,映射不会保存,只有实体。

感谢, 杰森

+0

这只是事实的一半。基本上,你需要的只是一个Session.Flush(),但是因为Transaction.Commit()隐含地做了这个,所以你可以使用Transaction.Commit()。 – 2012-03-20 07:52:02

0

我认为这个问题是在inverse=true的CalendarEvent。你应该删除它

相关问题