I have two entities, a Shelf and a Product:
public class Shelf
{
public virtual IList<Product> Products { get; set; }
public Shelf()
{
Products = new List<Product>();
}
}
public class Product
{
public virtual string Name { get; set; }
}
Basically put, a Shelf can contain many Products, and a Product can be put on many Shelves. Thus, there's a unidirectional many-to-many relationship between Shelf and Product. When I run the following code:
var shelf = new Shelf();
var product = new Product { Name = "Peas" };
shelf.Products.Add(product);
using (var session = SessionFactory.OpenSession())
{
session.Save(shelf);
}
NHibernate will save the Product and the Shelf, but it won't save the relationship between them, so if you retrieve the Shelf, it will contain zero Products.
However, if I add a session.Flush() call, it will save the relationship correctly so that retrieving the Shelf will return one Product.
This blog post details my issue:
http://www.neeraj.name/2005/07/02/hibernate-session-close-does-not-call-session-flush.html
However, I was wondering why I need this session.Flush() call. It seems counter-intuitive that saving a Shelf with the right cascade behavior will save the Product, but fail to establish the relationship between the two unless I flush the session. It seems to me that a Save() call should save everything, and not just the entity themselves without their relationships.