protected virtual DatabaseSchema ProcessSchema(DatabaseSchema databaseSchema, GetSchemaOptions schemaOptions) { foreach (var t in databaseSchema.Tables) { foreach (var key in t.ForeignKeys.ToList()) { if (!key.KeyName.EndsWith("_BackReference")) { key.OtherTable.ForeignKeys.Add( key.BackReference = new ForeignKeySchema { KeyName = key.KeyName + "_BackReference", MemberName = key.MemberName + "_BackReference", AssociationType = AssociationType.Auto, OtherTable = t, ThisColumns = key.OtherColumns, OtherColumns = key.ThisColumns, CanBeNull = true, }); } } } foreach (var t in databaseSchema.Tables) { foreach (var key in t.ForeignKeys) { if (key.BackReference != null && key.AssociationType == AssociationType.Auto) { if (key.ThisColumns.All(_ => _.IsPrimaryKey)) { if (t.Columns.Count(_ => _.IsPrimaryKey) == key.ThisColumns.Count) { key.AssociationType = AssociationType.OneToOne; } else { key.AssociationType = AssociationType.ManyToOne; } } else { key.AssociationType = AssociationType.ManyToOne; } key.CanBeNull = key.ThisColumns.All(_ => _.IsNullable); } } foreach (var key in t.ForeignKeys) { string name = null; if (schemaOptions.GetAssociationMemberName != null) { name = schemaOptions.GetAssociationMemberName(key); if (name != null) { key.MemberName = name; } } if (name == null) { name = key.MemberName; if (key.BackReference != null && key.ThisColumns.Count == 1 && key.ThisColumns[0].MemberName.ToLower().EndsWith("id")) { name = key.ThisColumns[0].MemberName; name = name.Substring(0, name.Length - "id".Length); if (t.ForeignKeys.Select(_ => _.MemberName).Concat( t.Columns.Select(_ => _.MemberName)).Concat( new[] { t.TypeName }).All(_ => _ != name)) { name = key.MemberName; } } if (name == key.MemberName) { if (name.StartsWith("FK_")) { name = name.Substring(3); } if (name.EndsWith("_BackReference")) { name = name.Substring(0, name.Length - "_BackReference".Length); } name = string.Join("", name .Split('_') .Where(_ => _.Length > 0 && _ != t.TableName && (t.SchemaName == null || t.IsDefaultSchema || _ != t.SchemaName)) .ToArray()); } if (name.Length != 0 && t.ForeignKeys.Select(_ => _.MemberName).Concat( t.Columns.Select(_ => _.MemberName)).Concat( new[] { t.TypeName }).All(_ => _ != name)) { key.MemberName = name; } } } } return(databaseSchema); }
internal static void SetForeignKeyMemberName(GetSchemaOptions schemaOptions, TableSchema table, ForeignKeySchema key) { string name = null; if (schemaOptions.GetAssociationMemberName != null) { name = schemaOptions.GetAssociationMemberName(key); if (name != null) { key.MemberName = ToValidName(name); } } if (name == null) { name = key.MemberName; if (key.BackReference != null && key.ThisColumns.Count == 1 && key.ThisColumns[0].MemberName.ToLower().EndsWith("id")) { name = key.ThisColumns[0].MemberName; name = name.Substring(0, name.Length - "id".Length); if (table.ForeignKeys.Select(_ => _.MemberName).Concat( table.Columns.Select(_ => _.MemberName)).Concat( new[] { table.TypeName }).Any(_ => _ == name)) { name = key.MemberName; } } if (name == key.MemberName) { if (name.StartsWith("FK_")) { name = name.Substring(3); } if (name.EndsWith("_BackReference")) { name = name.Substring(0, name.Length - "_BackReference".Length); } name = string.Join("", name .Split('_') .Where(_ => _.Length > 0 && _ != table.TableName && (table.SchemaName == null || table.IsDefaultSchema || _ != table.SchemaName)) .ToArray()); var digitEnd = 0; for (var i = name.Length - 1; i >= 0; i--) { if (char.IsDigit(name[i])) { digitEnd++; } else { break; } } if (digitEnd > 0) { name = name.Substring(0, name.Length - digitEnd); } } if (string.IsNullOrEmpty(name)) { name = key.OtherTable != key.ThisTable ? key.OtherTable.TableName : key.KeyName; } if (table.ForeignKeys.Select(_ => _.MemberName).Concat( table.Columns.Select(_ => _.MemberName)).Concat( new[] { table.TypeName }).All(_ => _ != name)) { key.MemberName = ToValidName(name); } } }
protected virtual DatabaseSchema ProcessSchema(DatabaseSchema databaseSchema, GetSchemaOptions schemaOptions) { foreach (var t in databaseSchema.Tables) { foreach (var key in t.ForeignKeys.ToList()) { if (!key.KeyName.EndsWith("_BackReference")) { key.OtherTable.ForeignKeys.Add( key.BackReference = new ForeignKeySchema { KeyName = key.KeyName + "_BackReference", MemberName = key.MemberName + "_BackReference", AssociationType = AssociationType.Auto, OtherTable = t, ThisColumns = key.OtherColumns, OtherColumns = key.ThisColumns, CanBeNull = true, }); } } } foreach (var t in databaseSchema.Tables) { foreach (var key in t.ForeignKeys) { if (key.BackReference != null && key.AssociationType == AssociationType.Auto) { if (key.ThisColumns.All(_ => _.IsPrimaryKey)) { if (t.Columns.Count(_ => _.IsPrimaryKey) == key.ThisColumns.Count) key.AssociationType = AssociationType.OneToOne; else key.AssociationType = AssociationType.ManyToOne; } else key.AssociationType = AssociationType.ManyToOne; key.CanBeNull = key.ThisColumns.All(_ => _.IsNullable); } } foreach (var key in t.ForeignKeys) { string name = null; if (schemaOptions.GetAssociationMemberName != null) { name = schemaOptions.GetAssociationMemberName(key); if (name != null) key.MemberName = name; } if (name == null) { name = key.MemberName; if (key.BackReference != null && key.ThisColumns.Count == 1 && key.ThisColumns[0].MemberName.ToLower().EndsWith("id")) { name = key.ThisColumns[0].MemberName; name = name.Substring(0, name.Length - "id".Length); if (t.ForeignKeys.Select(_ => _.MemberName). Concat( t.Columns. Select(_ => _.MemberName)).Concat( new[] { t.TypeName }).All(_ => _ != name)) { name = key.MemberName; } } if (name == key.MemberName) { if (name.StartsWith("FK_")) name = name.Substring(3); if (name.EndsWith("_BackReference")) name = name.Substring(0, name.Length - "_BackReference".Length); name = string.Join("", name .Split('_') .Where(_ => _.Length > 0 && _ != t.TableName && (t.SchemaName == null || t.IsDefaultSchema || _ != t.SchemaName)) .ToArray()); } if (name.Length != 0 && t.ForeignKeys.Select(_ => _.MemberName).Concat( t.Columns. Select(_ => _.MemberName)).Concat( new[] { t.TypeName }).All(_ => _ != name)) { key.MemberName = name; } } } } return databaseSchema; }