public void RemoveDetail(Detail d) { _details.Remove(d); }
public void MultiLevelCascade() { //if( dialect is Dialect.HSQLDialect ) return; object mid; object m0id; using (ISession s = OpenSession()) { Detail detail = new Detail(); SubDetail subdetail = new SubDetail(); Master m = new Master(); Master m0 = new Master(); m0id = s.Save(m0); m0.AddDetail(detail); detail.Master = m0; m.MoreDetails.Add(detail); detail.SubDetails = new HashSet<SubDetail> { subdetail }; mid = s.Save(m); s.Flush(); } using (ISession s = OpenSession()) { Master m = (Master) s.Load(typeof(Master), mid); IEnumerator enumer = m.MoreDetails.GetEnumerator(); enumer.MoveNext(); Assert.IsTrue(((Detail) enumer.Current).SubDetails.Count != 0); s.Delete(m); s.Delete(s.Load(typeof(Master), m0id)); s.Flush(); } }
public void AddDetail(Detail d) { _details.Add(d); }
public void Serialization() { ISession s = OpenSession(); Master m = new Master(); Detail d1 = new Detail(); Detail d2 = new Detail(); object mid = s.Save(m); d1.Master = (m); d2.Master = (m); m.AddDetail(d1); m.AddDetail(d2); if (Dialect is MsSql2000Dialect) { s.Save(d1); } else { s.Save(d1, 666L); } s.Flush(); s.Disconnect(); MemoryStream stream = new MemoryStream(); BinaryFormatter f = new BinaryFormatter(); f.Serialize(stream, s); stream.Position = 0; Console.WriteLine(stream.Length); s = (ISession) f.Deserialize(stream); stream.Close(); s.Reconnect(); Master m2 = (Master) s.Load(typeof(Master), mid); Assert.IsTrue(m2.Details.Count == 2, "serialized state"); foreach (Detail d in m2.Details) { Assert.IsTrue(d.Master == m2, "deserialization"); try { s.GetIdentifier(d); s.Delete(d); } catch (Exception e) { Assert.IsNotNull(e); //getting ride of 'e' is never used compile warning } } s.Delete(m2); s.Flush(); s.Close(); s = OpenSession(); mid = s.Save(new Master()); object mid2 = s.Save(new Master()); s.Flush(); s.Disconnect(); stream = new MemoryStream(); f.Serialize(stream, s); stream.Position = 0; s = (ISession) f.Deserialize(stream); stream.Close(); s.Reconnect(); s.Delete(s.Load(typeof(Master), mid)); s.Delete(s.Load(typeof(Master), mid2)); s.Flush(); s.Close(); s = OpenSession(); string db = s.Connection.Database; //force session to grab a connection try { stream = new MemoryStream(); f.Serialize(stream, s); } catch (Exception e) { Assert.IsTrue(e is InvalidOperationException, "illegal state"); s.Close(); return; } finally { stream.Close(); } Assert.IsTrue(false, "serialization should have failed"); }
public void UpdateLazyCollections() { // if (dialect is HSQLDialect) return; ISession s = OpenSession(); Master m = new Master(); Detail d1 = new Detail(); Detail d2 = new Detail(); d2.X = 14; object mid = s.Save(m); // s.Flush(); commented out in h2.0.3 also d1.Master = m; d2.Master = m; m.AddDetail(d1); m.AddDetail(d2); if (Dialect is MsSql2000Dialect) { s.Save(d1); s.Save(d2); } else { s.Save(d1, 666L); s.Save(d2, 667L); } s.Flush(); s.Close(); s = OpenSession(); m = (Master) s.Load(typeof(Master), mid); s.Close(); m.Name = "New Name"; s = OpenSession(); s.Update(m, mid); IEnumerator enumer = m.Details.GetEnumerator(); int i = 0; while (enumer.MoveNext()) { Assert.IsNotNull(enumer.Current); i++; } Assert.AreEqual(2, i); enumer = m.Details.GetEnumerator(); while (enumer.MoveNext()) { s.Delete(enumer.Current); } s.Delete(m); s.Flush(); s.Close(); }
public void Cascading() { //HSQLDialect return; ISession s = OpenSession(); Detail d1 = new Detail(); Detail d2 = new Detail(); d2.I = 22; Master m = new Master(); Master m0 = new Master(); object m0id = s.Save(m0); m0.AddDetail(d1); m0.AddDetail(d2); d1.Master = m0; d2.Master = m0; m.MoreDetails.Add(d1); m.MoreDetails.Add(d2); object mid = s.Save(m); s.Flush(); s.Close(); s = OpenSession(); m = (Master) s.Load(typeof(Master), mid); Assert.AreEqual(2, m.MoreDetails.Count, "cascade save"); IEnumerator enumer = m.MoreDetails.GetEnumerator(); enumer.MoveNext(); Assert.AreEqual(2, ((Detail) enumer.Current).Master.Details.Count, "cascade save"); s.Delete(m); s.Delete(s.Load(typeof(Master), m0id)); s.Flush(); s.Close(); }
public void MasterDetail() { //if( dialect is Dialect.HSQLDialect ) return; ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Master master = new Master(); Assert.IsNotNull(s.Save(master), "save returned native id"); object mid = s.GetIdentifier(master); Detail d1 = new Detail(); d1.Master = master; object did = s.Save(d1); Detail d2 = new Detail(); d2.I = 12; d2.Master = master; Assert.IsNotNull(s.Save(d2), "generated id returned"); master.AddDetail(d1); master.AddDetail(d2); if (Dialect.SupportsSubSelects) { string hql = "from d in class NHibernate.DomainModel.Detail, m in class NHibernate.DomainModel.Master " + "where m = d.Master and m.Outgoing.size = 0 and m.Incoming.size = 0"; Assert.AreEqual(2, s.CreateQuery(hql).List().Count, "query"); } t.Commit(); s.Close(); s = OpenSession(); t = s.BeginTransaction(); master = (Master) s.Load(typeof(Master), mid); IEnumerator enumer = master.Details.GetEnumerator(); int i = 0; while (enumer.MoveNext()) { Detail d = (Detail) enumer.Current; Assert.AreSame(master, d.Master, "master-detail"); i++; } Assert.AreEqual(2, i, "master-detail count"); t.Commit(); s.Close(); s = OpenSession(); t = s.BeginTransaction(); Assert.AreEqual(2, s.CreateQuery("select elements(master.Details) from Master master").List().Count); t.Commit(); s.Close(); s = OpenSession(); t = s.BeginTransaction(); IList list = s.CreateQuery("from Master m left join fetch m.Details").List(); Master m = (Master) list[0]; Assert.IsTrue(NHibernateUtil.IsInitialized(m.Details), "joined fetch should initialize collection"); Assert.AreEqual(2, m.Details.Count); list = s.CreateQuery("from Detail d inner join fetch d.Master").List(); Detail dt = (Detail) list[0]; object dtid = s.GetIdentifier(dt); Assert.AreSame(m, dt.Master); t.Commit(); s.Close(); s = OpenSession(); t = s.BeginTransaction(); list = s.CreateQuery("select m from Master m1, Master m left join fetch m.Details where m.Name=m1.Name").List(); Assert.IsTrue(NHibernateUtil.IsInitialized(((Master) list[0]).Details)); dt = (Detail) s.Load(typeof(Detail), dtid); Assert.IsTrue(((Master) list[0]).Details.Contains(dt)); t.Commit(); s.Close(); s = OpenSession(); t = s.BeginTransaction(); list = s.CreateQuery("select m, m1.Name from Master m1, Master m left join fetch m.Details where m.Name=m1.Name").List(); Master masterFromHql = (Master) ((object[]) list[0])[0]; Assert.IsTrue(NHibernateUtil.IsInitialized(masterFromHql.Details)); dt = (Detail) s.Load(typeof(Detail), dtid); Assert.IsTrue(masterFromHql.Details.Contains(dt)); // This line is commentend in H3.2 tests because it work in the classic parser // even if it as no sense ('join fetch' where the 'select' is a scalar) // The AST check the case with an Exception //list = s.CreateQuery("select m.id from Master m inner join fetch m.Details").List(); t.Commit(); s.Close(); s = OpenSession(); t = s.BeginTransaction(); Detail dd = (Detail) s.Load(typeof(Detail), did); master = dd.Master; Assert.IsTrue(master.Details.Contains(dd), "detail-master"); Assert.AreEqual(2, s.CreateFilter(master.Details, "order by this.I desc").List().Count); Assert.AreEqual(2, s.CreateFilter(master.Details, "select this where this.id > -1").List().Count); IQuery q = s.CreateFilter(master.Details, "where this.id > :id"); q.SetInt32("id", -1); Assert.AreEqual(2, q.List().Count); q = s.CreateFilter(master.Details, "where this.id > :id1 and this.id < :id2"); q.SetInt32("id1", -1); q.SetInt32("id2", 99999999); Assert.AreEqual(2, q.List().Count); q.SetInt32("id2", -1); Assert.AreEqual(0, q.List().Count); q = s.CreateFilter(master.Details, "where this.id in (:ids)"); list = new ArrayList(); list.Add(did); list.Add((long) -1); q.SetParameterList("ids", list); Assert.AreEqual(1, q.List().Count); Assert.IsTrue(q.Enumerable().GetEnumerator().MoveNext()); Assert.AreEqual(2, s.CreateFilter(master.Details, "where this.id > -1").List().Count); Assert.AreEqual(2, s.CreateFilter(master.Details, "select this.Master where this.id > -1").List().Count); Assert.AreEqual(2, s.CreateFilter(master.Details, "select m from m in class Master where this.id > -1 and this.Master=m") .List().Count); Assert.AreEqual(0, s.CreateFilter(master.Incoming, "where this.id > -1 and this.Name is not null").List().Count); IQuery filter = s.CreateFilter(master.Details, "select max(this.I)"); enumer = filter.Enumerable().GetEnumerator(); Assert.IsTrue(enumer.MoveNext()); Assert.IsTrue(enumer.Current is Int32); filter = s.CreateFilter(master.Details, "select max(this.I) group by this.id"); enumer = filter.Enumerable().GetEnumerator(); Assert.IsTrue(enumer.MoveNext()); Assert.IsTrue(enumer.Current is Int32); filter = s.CreateFilter(master.Details, "select count(*)"); enumer = filter.Enumerable().GetEnumerator(); Assert.IsTrue(enumer.MoveNext()); Assert.IsTrue(enumer.Current is Int64); Assert.AreEqual(2, s.CreateFilter(master.Details, "select this.Master").List().Count); IQuery f = s.CreateFilter(master.Details, "select max(this.I) where this.I < :top and this.I>=:bottom"); f.SetInt32("top", 100); f.SetInt32("bottom", 0); enumer = f.Enumerable().GetEnumerator(); Assert.IsTrue(enumer.MoveNext()); Assert.AreEqual(12, enumer.Current); f.SetInt32("top", 2); enumer = f.Enumerable().GetEnumerator(); Assert.IsTrue(enumer.MoveNext()); Assert.AreEqual(0, enumer.Current); f = s.CreateFilter(master.Details, "select max(this.I) where this.I not in (:list)"); IList coll = new ArrayList(); coll.Add(-666); coll.Add(22); coll.Add(0); f.SetParameterList("list", coll); enumer = f.Enumerable().GetEnumerator(); Assert.IsTrue(enumer.MoveNext()); Assert.AreEqual(12, enumer.Current); i = 0; foreach (Detail d in master.Details) { Assert.AreSame(master, d.Master, "master-detail"); s.Delete(d); i++; } Assert.AreEqual(2, i, "master-detail"); s.Delete(master); t.Commit(); s.Close(); }
public void TwoLeftJoinFetches() { Master m = new Master(); Detail d = new Detail(); m.Details = new HashedSet(); m.AddDetail( d ); d.Master = m; using( ISession s = OpenSession() ) { s.Save( m ); s.Save( d ); s.Flush(); } try { using( ISession s = OpenSession() ) { // Throws QueryException (cannot fetch multiple collections in one query) s.CreateQuery( "select m from Master m left join fetch m.Details d left join fetch d.SubDetails" ) .List(); } } finally { using( ISession s = OpenSession() ) { s.Delete( "from Detail" ); s.Delete( "from Master" ); s.Flush(); } } }