Ejemplo n.º 1
0
        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."));
            }
        }