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); } }
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); }