public virtual string GetReferenceName(IReferenceDefinition reference) { string pkColumnNames = Algorithms.Join("", reference.PkColumns, s => s); string fkColumnNames = Algorithms.Join("", reference.FkColumns, s => s); return string.Format("FK_{0}_{1}_{2}_{3}", GetBareIdentifier(reference.FkTable), fkColumnNames, GetBareIdentifier(reference.PkTable), pkColumnNames); }
private void BindForeignKeyTable(IAddReferenceNode addReferenceNode, IReferenceDefinition reference) { // If the parent of IAddReferenceNode is either IAddTableNode or IAlterTableNode, // ForeignKeyTable is the binding for that node if(addReferenceNode.Parent is IAddTableNode || addReferenceNode.PkColumns is IAlterTableNode) { addReferenceNode.FkTable = reference.FkTable = Environment.Schema.GetTable(((ITableNode)addReferenceNode.Parent).Name).Name; return; } // if // // If parent is IAddColumnNode or IAlterColumnNode, we just move on level higher // and do basically the same if(addReferenceNode.Parent is IAddColumnNode || addReferenceNode.PkColumns is IAlterColumnNode) { addReferenceNode.FkTable = reference.FkTable = Environment.Schema.GetTable(((ITableNode)addReferenceNode.Parent.Parent).Name).Name; return; } // if // // If foreign key table is explicitly specified in properties, use that if(addReferenceNode.Properties[MdlSyntax.FkTable] != null) { ITableDefinition fkTable = Environment.Schema.GetTable(AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.FkTable].Value)); addReferenceNode.FkTable = reference.FkTable = fkTable.Name; return; } // if throw CreateMdlCompilerException(MdlCompilerResources.CouldNotResolveFkTableForAddReference, addReferenceNode.Name); }
private void BindForeignKeyColumns(IAddReferenceNode addReferenceNode, IReferenceDefinition reference) { // // If the parent of IAddReferenceNode is an IAddColumnNode or IAlterColumnNode, that column becomes the fk column if(addReferenceNode.Parent is IAddColumnNode || addReferenceNode.Parent is IAlterColumnNode) { string fkColumn = Environment.Schema.GetTable(reference.FkTable).GetColumn(((IAddColumnNode)addReferenceNode.Parent).Name).Name; addReferenceNode.FkColumns.Add(fkColumn); reference.FkColumns.Add(fkColumn); return; } // if // // fk-column must be explicitly specified if(addReferenceNode.Properties[MdlSyntax.FkColumn] != null) { // // FK table is already bound here IColumnDefinition fkColumn = Environment.Schema.GetTable(reference.FkTable).GetColumn( AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.FkColumn].Value)); addReferenceNode.FkColumns.Add(fkColumn.Name); reference.FkColumns.Add(fkColumn.Name); return; } // if // // If we have fk-columns specified if(addReferenceNode.Properties[MdlSyntax.FkColumns] != null) { IListAstNodePropertyValue list = (IListAstNodePropertyValue)addReferenceNode.Properties[MdlSyntax.FkColumns].Value; foreach(IAstNodePropertyValue value in list.Items) { string fkColumnName = ((IStringAstNodePropertyValue)value).Value; // // FK table is already bound here IColumnDefinition fkColumn = Environment.Schema.GetTable(reference.FkTable).GetColumn(fkColumnName); addReferenceNode.FkColumns.Add(fkColumn.Name); reference.FkColumns.Add(fkColumn.Name); } // foreach return; } // if throw CreateMdlCompilerException(MdlCompilerResources.CouldNotResolveFkColumnForAddReference, addReferenceNode.Name); }
private void BindPrimaryKeyTable(IAddReferenceNode addReferenceNode, IReferenceDefinition reference) { if(addReferenceNode.Properties[MdlSyntax.PkTable] != null) { string pkTableName = AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.PkTable].Value); ITableDefinition pkTable = Environment.Schema.GetTable(pkTableName); if(pkTable == null) throw new MigrationException(string.Format("Could not resolve Primary Key table '{0}'", pkTableName)); addReferenceNode.PkTable = pkTable.Name; reference.PkTable = pkTable.Name; return; } // if throw CreateMdlCompilerException(MdlCompilerResources.CouldNotResolvePkTableForAddReference, addReferenceNode.Name); }
private void BindPrimaryKeyColumns(IAddReferenceNode addReferenceNode, IReferenceDefinition reference) { // // Presence of "pk-column" means we're referencing only one column. if(addReferenceNode.Properties[MdlSyntax.PkColumn] != null) { // // Primary key table must already be bound, so we can use just that. IColumnDefinition pkColumn = Environment.Schema.GetTable(reference.PkTable).GetColumn( AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.PkColumn].Value)); addReferenceNode.PkColumns.Add(pkColumn.Name); reference.PkColumns.Add(pkColumn.Name); } // if else { // // Neither pk-column nor pk-columns were specified, so we assume // that this is a reference to the primary key of the pk-table var pkColumns = Environment.Schema.GetTable(reference.PkTable).GetPrimaryKeyColumns(); if(pkColumns == null) throw new MigrationException(string.Format("Table '{0}' has not Primary Key defined", reference.PkTable)); if(pkColumns.Length > 1) throw new MigrationException( string.Format("Table '{0}' has Composite Primary Key defined. You have to explicitly specify 'pk-column` property", reference.PkTable)); addReferenceNode.PkColumns.Add(pkColumns[0].Name); reference.PkColumns.Add(pkColumns[0].Name); } }
/// <summary> /// /// </summary> /// <param name="reference"></param> /// <param name="addReferenceNode"></param> private static void CopyProperties(IReferenceDefinition reference, IAddReferenceNode addReferenceNode) { if(!string.IsNullOrEmpty(reference.PkTable)) AddProperty(addReferenceNode, MdlSyntax.PkTable, reference.PkTable); if(reference.PkColumns.Count == 1) AddProperty(addReferenceNode, MdlSyntax.PkColumn, reference.PkColumns[0]); else AddListProperty(addReferenceNode, MdlSyntax.PkColumns, Algorithms.Convert<string, IAstNodePropertyValue>(reference.PkColumns, delegate(string input) { return new StringAstNodePropertyValue(input); })); if(!string.IsNullOrEmpty(reference.FkTable)) AddProperty(addReferenceNode, MdlSyntax.FkTable, reference.FkTable); if(reference.FkColumns.Count == 1) AddProperty(addReferenceNode, MdlSyntax.FkColumn, reference.FkColumns[0]); else AddListProperty(addReferenceNode, MdlSyntax.FkColumns, Algorithms.Convert<string, IAstNodePropertyValue>(reference.FkColumns, delegate(string input) { return new StringAstNodePropertyValue(input); })); }