public void FreezeReference(TableModel table, IEnumerable <TableModel> tables) { ReferenceTable = tables.FirstOrDefault(t => t.Property.Name == _referenceTable.Name); if (ReferenceTable == null) { throw BuilderError.SelectorNotMappedToTable(_referenceTable.Name, _referenceTable.DeclaringType.Name).AsException(); } ReferenceColumns = _referenceColumns.MatchColumns(ReferenceTable.Name, ReferenceTable.Columns).ToImmutableArray(); // If the name was not explicitly set then we generate one based on the table and column names if (Name == null) { Name = BuilderHelper.GenerateForeignKeyName(table.Schema, table.Name, KeyColumns.Select(c => c.Name), ReferenceTable.Schema, ReferenceTable.Name); } }
static void ParseDatabaseBuild(SyntaxNodeAnalysisContext context, InvocationExpressionSyntax expression) { var innerModel = ParseDatabaseChain(context, expression); foreach (var table in innerModel.Tables) { foreach (var foreignKey in table.ForeignKeys) { if (foreignKey.ReferenceTableSelector.HasValue) { var referenceTable = innerModel.Tables.FirstOrDefault(t => t.Property.HasValue && t.Property.Value.Name == foreignKey.ReferenceTableSelector.Value.Item1.Name); if (referenceTable == null) { context.ReportDiagnostic(BuilderError.SelectorNotMappedToTable(foreignKey.ReferenceTableSelector.Value.Item1.Name, ToString(innerModel.Name)).MakeDiagnostic(foreignKey.ReferenceTableSelector.Value.Item2)); foreignKey.ReferenceTable = new Optional <FuzzyTableModel>(); break; } else { foreignKey.ReferenceTable = new Optional <FuzzyTableModel>(referenceTable); } foreignKey.ReferenceColumns = AH.MatchColumns(context, foreignKey.ReferenceColumnSelectors.Value, referenceTable.Columns, ToString(referenceTable.Name)); if (!foreignKey.Name.HasValue && table.Schema.HasValue && table.Name.HasValue && foreignKey.KeyColumns.HasValue && foreignKey.KeyColumns.Value.All(k => k.Model.Name.HasValue) && foreignKey.ReferenceTable.HasValue && foreignKey.ReferenceTable.Value.Schema.HasValue && foreignKey.ReferenceTable.Value.Name.HasValue) { foreignKey.Name = BuilderHelper.GenerateForeignKeyName(table.Schema.Value, table.Name.Value, foreignKey.KeyColumns.Value.Select(k => k.Model.Name.Value), foreignKey.ReferenceTable.Value.Schema.Value, foreignKey.ReferenceTable.Value.Name.Value); } if (foreignKey.KeyColumns.HasValue) { foreach (var columnPair in foreignKey.KeyColumns.Value.Zip(foreignKey.ReferenceColumns.Value, (l, r) => (l, r))) { if (columnPair.Item1.Model.Type.HasValue && columnPair.Item2.Model.Type.HasValue && columnPair.Item1.Model.Type.Value != columnPair.Item2.Model.Type.Value) { context.ReportDiagnostic(ModelBuilderError.ForeignKeyColumnTypesDontMatch(foreignKeyName: ToString(foreignKey.Name), keyColumnName: ToString(columnPair.Item1.Model.Name), keyColumnType: columnPair.Item1.Model.Type.Value.ToString(), referenceColumnName: ToString(columnPair.Item2.Model.Name), referenceColumnType: columnPair.Item2.Model.Type.Value.ToString()).MakeDiagnostic(columnPair.Item1.Location, new List <Location>() { columnPair.Item2.Location })); } } } } } } }
public async void Error_On_ReferenceTable_Not_In_Table_List(string location, string foreignKey) { await VerifyForeignKeyErrorRaised(BuilderError.SelectorNotMappedToTable("Cities", "Database"), foreignKey, location); }