public List <SqlStringBuilder> GetInsertStatements(object instance, Database db) { List <SqlStringBuilder> results = new List <SqlStringBuilder>(); db = db ?? Database; SqlStringBuilder rootInsert = db.GetService <SqlStringBuilder>(); Type type = instance.GetType(); TypeInheritanceDescriptor inheritance = new TypeInheritanceDescriptor(type); Type rootType = inheritance.RootType; rootInsert.Insert(Dao.TableName(rootType), GetBaseTypeAssignValues(rootType, instance, rootInsert.ColumnNameFormatter).ToArray()); rootInsert.Id(); rootInsert.Go(); results.Add(rootInsert); inheritance.Chain.BackwardsEach(typeTable => { Type tableType = typeTable.Type; if (tableType != rootType) { SqlStringBuilder inheritor = db.GetService <SqlStringBuilder>(); inheritor.Insert(Dao.TableName(tableType), GetInheritingTypeAssignValues(tableType, instance, inheritor.ColumnNameFormatter).ToArray()); inheritor.Go(); results.Add(inheritor); } }); return(results); }
public List <SqlStringBuilder> GetUpdateStatements(object instance, Type type, Database db) { List <SqlStringBuilder> results = new List <SqlStringBuilder>(); db = db ?? Database; SqlStringBuilder rootUpdate = db.GetService <SqlStringBuilder>(); Func <string, string> columnNameFormatter = rootUpdate.ColumnNameFormatter; AssignValue uniqueness = GetUniquenessFilter(instance, columnNameFormatter); TypeInheritanceDescriptor inheritance = new TypeInheritanceDescriptor(type); Type rootType = inheritance.RootType; rootUpdate.Update(Dao.TableName(rootType), GetBaseTypeAssignValues(rootType, instance, columnNameFormatter).ToArray()).Where(uniqueness); results.Add(rootUpdate); inheritance.Chain.BackwardsEach(typeTable => { Type tableType = typeTable.Type; if (tableType != rootType) { SqlStringBuilder inheritor = db.GetService <SqlStringBuilder>(); inheritor.Update(Dao.TableName(tableType), GetInheritingTypeAssignValues(tableType, instance, columnNameFormatter).ToArray()).Where(uniqueness); inheritor.Go(); results.Add(inheritor); } }); return(results); }
protected override void AddSchemaTables(TypeSchema typeSchema, SchemaManager schemaManager, ITypeTableNameProvider tableNameProvider = null) { tableNameProvider = tableNameProvider ?? new EchoTypeTableNameProvider(); foreach (Type topType in typeSchema.Tables) { TypeInheritanceDescriptor inheritance = new TypeInheritanceDescriptor(topType); Type inheritFrom = null; inheritance.Chain.BackwardsEach(typeTable => { string tableName = typeTable.GetTableName(tableNameProvider); schemaManager.AddTable(tableName); schemaManager.ExecutePreColumnAugmentations(tableName); typeTable.PropertyColumns.Each(pc => { AddPropertyColumn(schemaManager, typeSchema.DefaultDataTypeBehavior, tableName, pc.PropertyInfo); }); schemaManager.ExecutePostColumnAugmentations(tableName); schemaManager.AddColumn(tableName, "Id", DataTypes.Long); if (inheritFrom != null) { schemaManager.SetForeignKey(tableNameProvider.GetTableName(inheritFrom), tableName, "Id", "Id"); } else { schemaManager.SetKeyColumn(tableName, "Id"); } inheritFrom = typeTable.Type; }); } }
private void AddAdditionalReferenceAssemblies(TypeInheritanceDescriptor typeInheritanceDescriptor) { if (!_additionalReferenceTypes.Contains(typeInheritanceDescriptor.Type)) { AddAdditionalReferenceAssemblies(typeInheritanceDescriptor.Type); foreach (TypeTable type in typeInheritanceDescriptor.Chain) { AddAdditionalReferenceAssemblies(type.Type); } } }