c# - Nhibernate One To Many With Criteria - Stack Overflow
Immediate fetching - an association, collection or attribute is fetched immediately, strategy used by Get() or Load(), simply use a ICriteria query, for example: uses them to enable lazy fetching of many-to-one and one-to-one associations. You are getting more rows in the second query because you are JOINing with MyAssociatedObj, which seems to be in a many-to-one relationship with your. hibernate-mapping. Loading read-only entities from an HQL query/criteria. Unidirectional one-to-one and many-to-one.
Make sure to make it virtual. At this point, you may be wondering: Ultimately, I recommend you seriously consider using ISet for most one-to-many situations like this because it has the semantics most situations would expect.
You can change it later if you start running into problems.
NHibernate - Relationships
You need three things to map a collection like this: The collection type bag, set, map, list, etc. The name of the child class that will be contained in the collection i.
- Ayende @ Rahien
The one-to-many mapping from Customer to SalesOrderHeader will end up looking like this: Perhaps in a future version NHibernate may grow smart enough to determine this automatically, but for now the problem can get complicated when more relationships are involved, so you have to give NHibernate some hints.
Saving and Updating OTM Collections Now that I have the bi-directional relationship wired up correctly, I can talk about how to properly relate the objects together through code.
Again, imagine what would be required to create this association purely in memory as if there were no database to worry about it. Likely, that code would look like: Savethis is exactly the code that will create the proper structure for NHibernate to persist the relationship properly to the database.
By default, NHibernate will not do any cascading of operations such as deleting a related entity when you remove it from the collection, etc. NHibernate does, however, have very powerful and configurable cascade and life-cycle management features. Add order ; session. Commit ; Notice that the only difference is the two calls to session. Retrieving the Collection By default, when you get a Customer from the database, the SalesOrders list will be an empty proxy for lazy loading purposes.
When you attempt to enumerate over the collection call foreach or pass the list to some method that will end up looping over the listthe proxy will trigger a lazy load and then load all the related SalesOrderHeader objects. As I mentioned before, you can configure this behavior.
This is only the default. The NHibernate online documentation has good coverage of all of these and would serve as a better reference for all the details.
This is not a real many-to-many relationship. It is, in fact, a ternary relationship. You can think of it logically as a many-to-many relationship, but you should model it as a ternary relationship. I touched briefly on transparent lazy loading which, in and of itself, is a really nice feature.
Lazy Loading NHibernate, by default, will lazy load all related objects and collections. NHibernate uses the Castle. DynamicProxy2 project to generate its lazy load proxy classes. These proxies will intercept any call and trigger NHibernate to retrieve the object or objects represented by the proxy. In order to lazy load an individual referenced type i. All the mapped properties must be marked as virtual Overridable in VB in order to allow the proxy to override them and detect when there is an attempt to access data from the proxy thus triggering a database retrieval.
For small projects without a lot of performance concerns, you can safely use lazy loading with impunity. For larger projects with high load-where index usage and cache hits are very important, lazy loading can backfire on you and cause more problems than it solves.
Also, obsession about performance early on in an average line-of-business application project is a known anti-pattern and will usually set you back more than it helps you. Just remember to keep in mind that NHibernate does not give you an excuse to ignore database performance optimization-it just makes it easier and localized to a single point of configuration.
Relational Database Persistence with NHibernate, Part 2
Cascading Operations Another feature of NHibernate that enables transparency of the underlying persistence mechanism is the cascading of operations from a parent to its related child objects collection. By default, NHibernate will not cascade any operations from a parent entity to a child entity. If you are mapping a relationship one way i. NHibernate will not cascade anything. Kind, AverageRating ; result.
Relational Database Persistence with NHibernate, Part 2
We've got our customer here, we're creating a new one, and you can see that the collection is initialized with the following pair of orders. WriteLine newCustomer ; session.
WriteLine reloaded ; tx. John Doe Points: John Doe 9b0fcfffbda5-a5bede2ba Points: As you can see that initially the customer has 2 orders, but when we reload it, there are no orders to be seen. If you look at customer. So NHibernate knows nothing about it. Let's go ahead and add it.
We need to specify a key which is the name of the foreign key or to find orders. These orders are identified or belong to a customer through the customer ID. And then I have to note that this is a one-to-many relationship and it is with the order class. We also need to slightly change the Main method by saving the new customer orders to the database as well as shown in the following program.
Save newCustomer ; foreach var order in newCustomer. WriteLine "The orders were ordered by: