Mercurial > pub > bltoolkit
diff HowTo/Data/ComplexMapping.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HowTo/Data/ComplexMapping.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; + +using NUnit.Framework; + +using BLToolkit.Mapping; +using BLToolkit.Data; +using BLToolkit.DataAccess; +using BLToolkit.Reflection.Extension; + +namespace HowTo.Data +{ + [TestFixture] + public class ComplexMapping + { + const string TestQuery = @" + -- Parent Data + SELECT 1 as ParentID + UNION SELECT 2 as ParentID + + -- Child Data + SELECT 4 ChildID, 1 as ParentID + UNION SELECT 5 ChildID, 2 as ParentID + UNION SELECT 6 ChildID, 2 as ParentID + UNION SELECT 7 ChildID, 1 as ParentID + + -- Grandchild Data + SELECT 1 GrandchildID, 4 as ChildID + UNION SELECT 2 GrandchildID, 4 as ChildID + UNION SELECT 3 GrandchildID, 5 as ChildID + UNION SELECT 4 GrandchildID, 5 as ChildID + UNION SELECT 5 GrandchildID, 6 as ChildID + UNION SELECT 6 GrandchildID, 6 as ChildID + UNION SELECT 7 GrandchildID, 7 as ChildID + UNION SELECT 8 GrandchildID, 7 as ChildID +"; + + public class Parent + { + [MapField("ParentID"), /*[a]*/PrimaryKey/*[/a]*/] + public int ID; + + /*[a]*/[Relation(typeof(Child))]/*[/a]*/ + public List<Child> Children = new List<Child>(); + } + + [MapField("ParentID", "Parent.ID")] + public class Child + { + [MapField("ChildID"), /*[a]*/PrimaryKey/*[/a]*/] + public int ID; + + /*[a]*/[Relation]/*[/a]*/ + public Parent Parent = new Parent(); + + /*[a]*/[Relation(typeof(Grandchild))]/*[/a]*/ + public List<Grandchild> Grandchildren = new List<Grandchild>(); + } + + [MapField("ChildID", "Child.ID")] + public class Grandchild + { + [MapField("GrandchildID"), /*[a]*/PrimaryKey/*[/a]*/] + public int ID; + + /*[a]*/[Relation]/*[/a]*/ + public Child Child = new Child(); + } + + [Test] + public void Test() + { + List<Parent> parents = new List<Parent>(); + /*[a]*/MapResultSet/*[/a]*/[] sets = new MapResultSet[3]; + + sets[0] = new MapResultSet(typeof(Parent), parents); + sets[1] = new MapResultSet(typeof(Child)); + sets[2] = new MapResultSet(typeof(Grandchild)); + + sets[0].AddRelation(sets[1], "ParentID", "ParentID", "Children"); + sets[1].AddRelation(sets[0], "ParentID", "ParentID", "Parent"); + + sets[1].AddRelation(sets[2], "ChildID", "ChildID", "Grandchildren"); + sets[2].AddRelation(sets[1], "ChildID", "ChildID", "Child"); + + using (DbManager db = new DbManager()) + { + db + .SetCommand (TestQuery) + ./*[a]*/ExecuteResultSet/*[/a]*/(sets); + } + + Assert.IsNotEmpty(parents); + + foreach (Parent parent in parents) + { + Assert.IsNotNull(parent); + Assert.IsNotEmpty(parent.Children); + + foreach (Child child in parent.Children) + { + Assert.AreEqual(parent, child.Parent); + Assert.IsNotEmpty(child.Grandchildren); + + foreach (Grandchild grandchild in child.Grandchildren) + { + Assert.AreEqual(child, grandchild.Child); + Assert.AreEqual(parent, grandchild.Child.Parent); + } + } + } + } + + [Test] + public void Test2() + { + List<Parent> parents = new List<Parent>(); + /*[a]*/MapResultSet/*[/a]*/[] sets = new MapResultSet[3]; + + sets[0] = new MapResultSet(typeof(Parent), parents); + sets[1] = new MapResultSet(typeof(Child)); + sets[2] = new MapResultSet(typeof(Grandchild)); + + using (DbManager db = new DbManager()) + { + db + .SetCommand(TestQuery) + ./*[a]*/ExecuteResultSet/*[/a]*/(sets); + } + + Assert.IsNotEmpty(parents); + + foreach (Parent parent in parents) + { + Assert.IsNotNull(parent); + Assert.IsNotEmpty(parent.Children); + + foreach (Child child in parent.Children) + { + Assert.AreEqual(parent, child.Parent); + Assert.IsNotEmpty(child.Grandchildren); + + foreach (Grandchild grandchild in child.Grandchildren) + { + Assert.AreEqual(child, grandchild.Child); + Assert.AreEqual(parent, grandchild.Child.Parent); + } + } + } + } + + public class ParentEx + { + public int ID; + public List<ChildEx> Children = new List<ChildEx>(); + } + + public class ChildEx + { + public int ID; + public ParentEx Parent = new ParentEx(); + public List<GrandchildEx> Grandchildren = new List<GrandchildEx>(); + } + + public class GrandchildEx + { + public int ID; + public ChildEx Child = new ChildEx(); + } + + static readonly MappingSchema _mappingSchema = new MappingSchema + { + Extensions = TypeExtension.GetExtensions("RelationExtension.xml") + }; + + [Test] + public void Test3() + { + var parents = new List<ParentEx>(); + var sets = new /*[a]*/MapResultSet/*[/a]*/[3]; + + sets[0] = new MapResultSet(typeof(ParentEx), parents); + sets[1] = new MapResultSet(typeof(ChildEx)); + sets[2] = new MapResultSet(typeof(GrandchildEx)); + + using (var db = new DbManager()) + { + db.MappingSchema = _mappingSchema; + + db + .SetCommand(TestQuery) + ./*[a]*/ExecuteResultSet/*[/a]*/(sets); + } + + Assert.IsNotEmpty(parents); + + foreach (ParentEx parent in parents) + { + Assert.IsNotNull(parent); + Assert.IsNotEmpty(parent.Children); + + foreach (ChildEx child in parent.Children) + { + Assert.AreEqual(parent, child.Parent); + Assert.IsNotEmpty(child.Grandchildren); + + foreach (GrandchildEx grandchild in child.Grandchildren) + { + Assert.AreEqual(child, grandchild.Child); + Assert.AreEqual(parent, grandchild.Child.Parent); + } + } + } + } + } +}