private static void ValidateForeignKeyNames(Association element, List <string> errorMessages) { if (!string.IsNullOrWhiteSpace(element.FKPropertyName)) { string[] foreignKeyPropertyNames = element.GetForeignKeyPropertyNames(); string tag = $"({element.Source.Name}:{element.Target.Name})"; if (element.Dependent == null) { errorMessages.Add($"{tag} can't have foreign keys defined; no dependent role found"); return; } int propertyCount = foreignKeyPropertyNames.Length; int identityCount = element.Principal.AllIdentityAttributes.Count(); if (propertyCount != identityCount) { errorMessages.Add($"{tag} foreign key must have zero or {identityCount} {(identityCount == 1 ? "property" : "properties")} defined, " + $"since {element.Principal.Name} has {identityCount} identity properties. Found {propertyCount} instead"); } // validate names foreach (string propertyName in foreignKeyPropertyNames) { if (!CodeGenerator.IsValidLanguageIndependentIdentifier(propertyName)) { errorMessages.Add($"{tag} FK property name '{propertyName}' isn't a valid .NET identifier"); } if (element.Dependent.AllAttributes.Except(element.Dependent.Attributes).Any(a => a.Name == propertyName)) { errorMessages.Add($"{tag} FK property name '{propertyName}' is used in a base class of {element.Dependent.Name}"); } } // ensure no FKs are autogenerated identities errorMessages.AddRange(element.GetFKAutoIdentityErrors() .Select(attribute => $"{attribute.Name} in {element.Dependent.FullName} is an auto-generated identity. Migration will fail.")); } }