public void QueuedBagAdds()
		{
			ISession s = OpenSession();
			Assignable a = new Assignable();
			a.Id = "foo";
			a.Categories = new ArrayList();
			Category c = new Category();
			c.Assignable = a;
			a.Categories.Add(c);
			s.Save(a);
			s.Flush();
			s.Close();

			sessions.EvictCollection("NHibernate.DomainModel.Assignable.Categories");

			s = OpenSession();
			a = (Assignable) s.Get(typeof(Assignable), "foo");
			c = new Category();
			c.Assignable = a;
			a.Categories.Add(c);
			Assert.IsFalse(NHibernateUtil.IsInitialized(a.Categories));
			Assert.AreEqual(2, a.Categories.Count);
			s.Flush();
			s.Close();

			sessions.EvictCollection("NHibernate.DomainModel.Assignable.Categories");

			s = OpenSession();
			a = (Assignable) s.Get(typeof(Assignable), "foo");
			c = new Category();
			c.Assignable = a;
			a.Categories.Add(c);
			Assert.IsFalse(NHibernateUtil.IsInitialized(a.Categories));
			s.Flush();
			Assert.IsFalse(NHibernateUtil.IsInitialized(a.Categories));
			Assert.AreEqual(3, a.Categories.Count);
			s.Close();

			sessions.EvictCollection("NHibernate.DomainModel.Assignable.Categories");

			s = OpenSession();
			a = (Assignable) s.Get(typeof(Assignable), "foo");
			Assert.AreEqual(3, a.Categories.Count);
			s.Delete(a);
			s.Flush();
			s.Close();
		}
		public void MixNativeAssigned()
		{
			// if HSQLDialect then skip test
			ISession s = OpenSession();
			Category c = new Category();
			c.Name = "NAME";
			Assignable assn = new Assignable();
			assn.Id = "i.d.";
			IList l = new ArrayList();
			l.Add(c);
			assn.Categories = l;
			c.Assignable = assn;
			s.Save(assn);
			s.Flush();
			s.Close();

			s = OpenSession();
			s.Delete(assn);
			s.Flush();
			s.Close();
		}
		public void NamedSQLQuery()
		{
			if( dialect is Dialect.MySQLDialect )
			{
				return;
			}

			ISession s = OpenSession();
			
			Category c = new Category();
			c.Name = "NAME";
			Assignable assn = new Assignable();
			assn.Id = "i.d.";
			IList l = new ArrayList();
			l.Add( c );
			assn.Categories = l;
			c.Assignable = assn;
			s.Save( assn );
			s.Flush();
			s.Close();

			s = OpenSession();
			IQuery q = s.GetNamedQuery( "namedsql" );
			Assert.IsNotNull( q, "should have found 'namedsql'" );
			IList list = q.List();
			Assert.IsNotNull( list, "executing query returns list" );

			object[] values = list[0] as object[];
			Assert.IsNotNull( values[0], "index 0 should not be null" );
			Assert.IsNotNull( values[1], "index 1 should not be null" );

			Assert.AreEqual( typeof(Category), values[0].GetType(), "should be a Category" );
			Assert.AreEqual( typeof(Assignable), values[1].GetType(), "should be Assignable" );
			s.Delete( "from Category" );
			s.Delete( "from Assignable" );
			s.Flush();
			s.Close();

		}
		public void FindBySQLParameters()
		{
			ISession s = OpenSession();
			Category c = new Category();
			c.Name = "Good";
			Assignable assn = new Assignable();
			assn.Id = "i.d.";
			IList l = new ArrayList();
			l.Add(c);
			assn.Categories = l;
			c.Assignable = assn;
			s.Save(assn);
			s.Flush();
			c = new Category();
			c.Name = "Best";
			assn = new Assignable();
			assn.Id = "i.d.2";
			l = new ArrayList();
			l.Add(c);
			assn.Categories = l;
			c.Assignable = assn;
			s.Save(assn);
			s.Flush();
			c = new Category();
			c.Name = "Better";
			assn = new Assignable();
			assn.Id = "i.d.7";
			l = new ArrayList();
			l.Add(c);
			assn.Categories = l;
			c.Assignable = assn;
			s.Save(assn);
			s.Flush();

			assn = new Assignable();
			assn.Id = "i.d.3";
			s.Save(assn);
			s.Flush();
			s.Close();

			s = OpenSession();
			IQuery basicParam = s.CreateSQLQuery("select {category.*} from Category {category} where {category}.Name = 'Best'", "category", typeof( Category ));
			IList list = basicParam.List();
			Assert.AreEqual(1, list.Count);

			IQuery unnamedParam = s.CreateSQLQuery("select {category.*} from Category {category} where {category}.Name = ? or {category}.Name = ?", "category", typeof( Category ));
			unnamedParam.SetString(0, "Good");
			unnamedParam.SetString(1, "Best");
			list = unnamedParam.List();
			Assert.AreEqual(2, list.Count);
		
			IQuery namedParam = s.CreateSQLQuery("select {category.*} from Category {category} where ({category}.Name=:firstCat or {category}.Name=:secondCat)", "category", typeof( Category ));
			namedParam.SetString("firstCat", "Better");
			namedParam.SetString("secondCat", "Best");
			list = namedParam.List();
			Assert.AreEqual(2, list.Count);
		
			s.Delete("from Assignable");
			s.Delete("from Category");
			s.Flush();
			s.Close();
		}
		public void FindBySQLMultipleObject()
		{
			ISession s = OpenSession();

			Category c = new Category();
			c.Name = "NAME";
			Assignable assn = new Assignable();
			assn.Id = "i.d.";
			IList l = new ArrayList();
			l.Add( c );
			assn.Categories = l;
			c.Assignable = assn;
			s.Save( assn );
			s.Flush();

			c = new Category();
			c.Name = "NAME2";
			assn = new Assignable();
			assn.Id = "i.d.2";
			l = new ArrayList();
			l.Add( c );
			assn.Categories = l;
			c.Assignable = assn;
			s.Save( assn );
			s.Flush();

			assn = new Assignable();
			assn.Id = "i.d.3";
			s.Save( assn );
			s.Flush();
			s.Close();

			s = OpenSession();

			if ( !(dialect is Dialect.MySQLDialect) )
			{
				IList list = s.CreateSQLQuery( "select {category.*}, {assignable.*} from Category {category}, \"assign able\" {assignable}", new string[] { "category", "assignable" }, new System.Type[] { typeof( Category ), typeof( Assignable ) } ).List();
				Assert.AreEqual( 6, list.Count, "Count differs" ); // cross-product of 2 categories x 3 assignables;
				Assert.IsTrue( list[0] is object[] );
			}

			s.Delete( "from Assignable" );
			s.Delete( "from Category" );
			s.Flush();
			s.Close();
		}
		public void FindBySQLAssociatedObject()
		{
			ISession s = OpenSession();

			Category c = new Category();
			c.Name = "NAME";
			Assignable assn = new Assignable();
			assn.Id = "i.d.";
			IList l = new ArrayList();
			l.Add( c );
			assn.Categories = l;
			c.Assignable = assn;
			s.Save( assn );
			s.Flush();
			s.Close();

			s = OpenSession();
			IList list = s.CreateSQLQuery( "select {category.*} from Category {category}", "category", typeof( Category ) ).List();
			Assert.AreEqual( 1, list.Count, "Count differs" );

			s.Delete( "from Assignable" );
			s.Delete( "from Category" );
			s.Flush();
			s.Close();
		}
		public void FindBySQLMultipleObject()
		{
			ISession s = OpenSession();

			Category c = new Category();
			c.Name = "NAME";
			Assignable assn = new Assignable();
			assn.Id = "i.d.";
			assn.Categories = new List<Category> {c};
			c.Assignable = assn;
			s.Save(assn);
			s.Flush();

			c = new Category();
			c.Name = "NAME2";
			assn = new Assignable();
			assn.Id = "i.d.2";
			assn.Categories = new List<Category> { c };
			c.Assignable = assn;
			s.Save(assn);
			s.Flush();

			assn = new Assignable();
			assn.Id = "i.d.3";
			s.Save(assn);
			s.Flush();
			s.Close();

			s = OpenSession();

			if (!(Dialect is MySQLDialect))
			{
				IList list =
					s.CreateSQLQuery("select {category.*}, {assignable.*} from Category {category}, \"assign able\" {assignable}")
					.AddEntity("category",   typeof(Category))
					.AddEntity("assignable", typeof(Assignable))
					.List();
				Assert.AreEqual(6, list.Count, "Count differs"); // cross-product of 2 categories x 3 assignables;
				Assert.IsTrue(list[0] is object[]);
			}

			s.Delete("from Assignable");
			s.Delete("from Category");
			s.Flush();
			s.Close();
		}