Example #1
0
        public void BlogHasManyPosts()
        {
            InitKernel();
            IRelationshipInferenceService relService = ObtainService();

            TableDefinition blogTable;
            TableDefinition postTable;

            BuildBlogPostsStructure(out blogTable, out postTable);

            BuildContext context = new BuildContext();

            ActiveRecordDescriptor arDesc = new ActiveRecordDescriptor();

            ActiveRecordPropertyDescriptor[] descs = relService.InferRelations(arDesc, blogTable, context);

            Assert.IsNotNull(descs);
            Assert.AreEqual(1, descs.Length);

            ActiveRecordHasManyDescriptor desc1 = descs[0] as ActiveRecordHasManyDescriptor;

            Assert.IsNotNull(desc1);
            Assert.IsNotNull(desc1.TargetType);
            Assert.IsNotNull(desc1.PropertyType);

            Assert.AreEqual("Posts", desc1.PropertyName);
            Assert.AreEqual("blog_id", desc1.ColumnName);
            Assert.AreEqual(typeof(IList), desc1.PropertyType);

            ActiveRecordDescriptor targetARDescriptor = context.GetNextPendent();

            Assert.AreSame(postTable, targetARDescriptor.Table);
        }
        private void CreateHasManyRelations(ActiveRecordDescriptor desc, TableDefinition tableDef,
                                            IList list, BuildContext context)
        {
            foreach (TableDefinition fkTable in tableDef.TablesReferencedByHasRelation)
            {
                String propertyName = _namingService.CreateRelationName(fkTable.Name);
                ActiveRecordDescriptor targetType = null;
                String           colName          = null;
                bool             pendentNecessary = false;
                ColumnDefinition selectedCol      = null;

                foreach (ColumnDefinition col in fkTable.Columns)
                {
                    if (col.RelatedTable == tableDef)
                    {
                        colName = col.Name;

                        if (col.RelatedTable.RelatedDescriptor == null && col.RelatedTable != fkTable)
                        {
                            col.RelatedTable.RelatedDescriptor = new ActiveRecordDescriptor(fkTable);

                            pendentNecessary = true;
                        }
                        else if (col.RelatedTable == tableDef)
                        {
                            targetType = desc;
                        }

                        if (targetType == null)
                        {
                            targetType = col.RelatedTable.RelatedDescriptor;
                        }

                        selectedCol = col;

                        break;
                    }
                }

                // Just to protect ourselves from awkward conditions
                if (colName == null)
                {
                    continue;
                }

                ActiveRecordHasManyDescriptor hasMany =
                    new ActiveRecordHasManyDescriptor(colName, propertyName, targetType);

                if (pendentNecessary)
                {
                    context.AddPendentDescriptor(hasMany, selectedCol.RelatedTable.RelatedDescriptor);
                }

                list.Add(hasMany);
            }
        }
Example #3
0
        public void SelfReference()
        {
            InitKernel();
            IRelationshipInferenceService relService = ObtainService();

            DatabaseDefinition dbdef = new DatabaseDefinition("alias");

            TableDefinition categoryTable = new TableDefinition("categories", dbdef);

            categoryTable.AddColumn(new ColumnDefinition("id", true, false, true, false, OleDbType.Integer));
            categoryTable.AddColumn(new ColumnDefinition("name", false, false, false, false, OleDbType.VarChar));
            categoryTable.AddColumn(new ColumnDefinition("parent_id", false, true, false, false, OleDbType.Integer, categoryTable));

            categoryTable.AddManyRelation(categoryTable);

            BuildContext context = new BuildContext();

            ActiveRecordDescriptor arDesc = new ActiveRecordDescriptor();

            ActiveRecordPropertyDescriptor[] descs = relService.InferRelations(arDesc, categoryTable, context);

            Assert.IsFalse(context.HasPendents);

            Assert.IsNotNull(descs);
            Assert.AreEqual(2, descs.Length);

            ActiveRecordHasManyDescriptor desc1 = descs[0] as ActiveRecordHasManyDescriptor;

            Assert.IsNotNull(desc1);
            Assert.IsNotNull(desc1.TargetType);
            Assert.IsNotNull(desc1.PropertyType);

            Assert.AreEqual("Categories", desc1.PropertyName);
            Assert.AreEqual("parent_id", desc1.ColumnName);
            Assert.AreEqual(typeof(IList), desc1.PropertyType);

            ActiveRecordBelongsToDescriptor desc2 = descs[1] as ActiveRecordBelongsToDescriptor;

            Assert.IsNotNull(desc2);
            Assert.IsNotNull(desc2.TargetType);
            Assert.IsNull(desc2.PropertyType);
            Assert.AreEqual("Category", desc2.PropertyName);
            Assert.AreEqual("parent_id", desc2.ColumnName);
        }