Anyone? On 1 mai, 17:09, Mark Kharitonov <[email protected]> wrote: > Dear ladies and sirs. > I am not sure, if this is a bug, I am doing something wrong or this is > a bug in NH 2, but not NH 3 or later. > Anyway, we are using NH 2. > > I have two types of entities, here are the mappings: > > <class name="Protocol, Entities" lazy="true" table="Protocol"> > <id name="Id" column="Id" type="string" > > <generator class="assigned"/> > </id> > > <bag name="AssociatedEndpoints" table="Endpoint_Protocol" > access="noop"> > <key column="ProtocolId"/> > <many-to-many column="EndpointId" class="Endpoint" /> > </bag> > </class> > > <class name="Endpoint, Entities" lazy="false" table="Endpoint"> > <id name="Id" column="Id" type="int" > > <generator class="native"/> > </id> > > <bag name="SupportedProtocols" table="Endpoint_Protocol" > lazy="true"> > <key column="EndpointId"/> > <many-to-many column="ProtocolId" class="Protocol" /> > </bag> > </class> > > At some point, the database contains two endpoints and a dozen of > protocols - each endpoint is bound to each protocol. Meaning, the > Endpoint_Protocol table contains two rows per each protocol. > > Now, the server is restarted and one of the endpoints is refreshed. If > I throw away all irrelevant stuff (which has really nothing to do with > the problem), the relevant code is: > > using (var session = GetSession()) > { > var endpoint = FetchEndpoint(session, data.Id); > using (var transaction = BeginTransaction(session)) > { > transaction.Commit(); > } > } > > Unless I do not understand something really basic, this code should > have no effect whatsoever on the database. And yet, after Commit > returns there the Endpoint_Protocol table is empty! Only the relations > were deleted, the entities themselves are fine. > > After debugging it, I have noticed this: > * Commiting flushes the entities and the collections found in the > session, > * While flushing the entities, it marks all those collections, which > are values of the mapped properties of some flushed entity - these are > the reachable collections. > * When flushing the collections, the unreachable ones are deleted from > the database. > > What happens, is that the fetch endpoint is reachable - of course. It > maps the SupportedProtocols property, hence all the protocol entities > are reachable as well. However, an AssociatedEndpoints collection > linked to each protocol entity is not reachable, because no mapped > property of Endpoint references it (recall thenoopaccess). At least, > this is how the PocoEntityTuplizer extract the reachable values of an > entity - AssociatedEndpoints is not reachable according to it. > > Hence I witness these collections being deleted. > > Note, that once I remove the access="noop" making it the default > access and add the respective private property to the Protocol entity, > everything works just fine. > > What am I doing wrong? > > Thanks.
-- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
