One2ManyExample - Adipa-G/ndbgate GitHub Wiki

Introduction

This demonstrates one to many relationship capability of the library using 2 types of different child objects.

Details#

Parent class

    [TableInfo("parent_entity")]
    public class One2ManyParentEntity : DefaultEntity
    {
        public One2ManyParentEntity()
        {
            ChildEntities = new List<One2ManyChildEntity>();
        }

        [ColumnInfo(ColumnType.Integer, Key = true)]
        public int Id { get; set; }

        [ColumnInfo(ColumnType.Varchar)]
        public string Name { get; set; }

        [ForeignKeyInfo("parent2childA",
            typeof (One2ManyChildEntityA),
            new[] {"id"},
            new[] {"parentId"},
            UpdateRule = ReferentialRuleType.Restrict,
            DeleteRule = ReferentialRuleType.Cascade)]
        [ForeignKeyInfo("parent2childB",
            typeof (One2ManyChildEntityB),
            new[] {"id"},
            new[] {"parentId"}, 
            UpdateRule = ReferentialRuleType.Restrict,
            DeleteRule = ReferentialRuleType.Cascade)]
        public ICollection<One2ManyChildEntity> ChildEntities { get; set; }
    }

Child Base Class

    public abstract class One2ManyChildEntity : DefaultEntity
    {
        public abstract string Name { get; set; }
    }

Child Sub Class 1

    [TableInfo("child_entity_a")]
    public class One2ManyChildEntityA : One2ManyChildEntity
    {
        [ColumnInfo(ColumnType.Integer, Key = true)]
        public int ParentId { get; set; }

        [ColumnInfo(ColumnType.Integer, Key = true)]
        public int IndexNo { get; set; }

        [ColumnInfo(ColumnType.Varchar)]
        public override string Name { get; set; }
    }

Child Sub Class 2

    [TableInfo("child_entity_b")]
    public class One2ManyChildEntityB : One2ManyChildEntity
    {
        [ColumnInfo(ColumnType.Integer, Key = true)]
        public int ParentId { get; set; }

        [ColumnInfo(ColumnType.Integer, Key = true)]
        public int IndexNo { get; set; }

        [ColumnInfo(ColumnType.Varchar)]
        public override string Name { get; set; }
    }

Testing Class

get the source for ExampleBase from https://github.com/Adipa-G/ndbgate/wiki/SimpleEntityExample

    public class One2ManyExample
    {
        public const int Id = 43;

        public One2ManyParentEntity CreateEntity()
        {
            One2ManyParentEntity entity = new One2ManyParentEntity();
            entity.Id = Id;
            entity.Name = "Parent";

            One2ManyChildEntityA childEntityA = new One2ManyChildEntityA();
            childEntityA.IndexNo = 0;
            childEntityA.Name = "Child A";
            entity.ChildEntities.Add(childEntityA);

            One2ManyChildEntityB childEntityB = new One2ManyChildEntityB();
            childEntityB.IndexNo = 1;
            childEntityB.Name = "Child B";
            entity.ChildEntities.Add(childEntityB);

            return entity;
        }

        public void Patch(ITransaction tx) 
        {
            ICollection<Type> entityTypes = new List<Type>();
            entityTypes.Add(typeof(One2ManyParentEntity));
            entityTypes.Add(typeof(One2ManyChildEntityA));
            entityTypes.Add(typeof(One2ManyChildEntityB));
            tx.DbGate.PatchDataBase(tx,entityTypes,false);
        }

        public void Persist(ITransaction tx, One2ManyParentEntity entity)
        {
            entity.Persist(tx);
        }

        public One2ManyParentEntity Retrieve(ITransaction tx)
        {
            IDbCommand cmd = tx.CreateCommand();
            cmd.CommandText = "select * from parent_entity where id = ?";

            IDbDataParameter parameter = cmd.CreateParameter();
            cmd.Parameters.Add(parameter);
            parameter.DbType = DbType.Int32;
            parameter.Value = Id;

            One2ManyParentEntity entity = null;
            IDataReader reader = cmd.ExecuteReader();
            if (reader.Read())
            {
                entity = new One2ManyParentEntity();
                entity.Retrieve(reader, tx);
            }
            DbMgtUtility.Close(reader);
            DbMgtUtility.Close(cmd);
            return entity;
        }

        public static void DoTest()
        {
            One2ManyExample example = new One2ManyExample();
            ITransaction tx = ExampleBase.SetupDb();
            example.Patch(tx);

            One2ManyParentEntity entity = example.CreateEntity();
            example.Persist(tx, entity);

            entity = example.Retrieve(tx);
            Console.WriteLine("Entity Name = " + entity.Name);
            foreach (One2ManyChildEntity childEntity in entity.ChildEntities)
            {
                Console.WriteLine("Entity Child Name = " + childEntity.Name);
            }

            entity.Name = "Updated Entity A";
            foreach (One2ManyChildEntity childEntity in entity.ChildEntities)
            {
                childEntity.Name += " Updated";
            }
            example.Persist(tx, entity);

            entity = example.Retrieve(tx);
            Console.WriteLine("Entity Name = " + entity.Name);
            foreach (One2ManyChildEntity childEntity in entity.ChildEntities)
            {
                Console.WriteLine("Entity Child Name = " + childEntity.Name);
            }

            entity.Status = EntityStatus.Deleted;
            example.Persist(tx, entity);

            entity = example.Retrieve(tx);
            Console.WriteLine("Entity = " + entity);

            ExampleBase.CloseDb();
        }
    }
⚠️ **GitHub.com Fallback** ⚠️