public virtual void AddKeysToModel([NotNull] Entity.Metadata.Model relationalModel) { Check.NotNull(relationalModel, nameof(relationalModel)); var entityTypeToForeignKeyConstraintsMap = new Dictionary <EntityType, Dictionary <string, List <Property> > >(); // string is ConstraintId foreach (var entityType in relationalModel.EntityTypes) { var primaryKeyProperties = new List <Property>(); var constraints = new Dictionary <string, List <Property> >(); entityTypeToForeignKeyConstraintsMap[entityType] = constraints; foreach (var property in entityType.Properties) { int primaryKeyOrdinal; if (_primaryKeyOrdinals.TryGetValue(property.Name, out primaryKeyOrdinal)) { primaryKeyProperties.Add(property); } Dictionary <string, int> foreignKeyConstraintIdOrdinalMap; if (_foreignKeyOrdinals.TryGetValue(property.Name, out foreignKeyConstraintIdOrdinalMap)) { // relationalProperty represents (part of) a foreign key foreach (var constraintId in foreignKeyConstraintIdOrdinalMap.Keys) { List <Property> constraintProperties; if (!constraints.TryGetValue(constraintId, out constraintProperties)) { constraintProperties = new List <Property>(); constraints.Add(constraintId, constraintProperties); } constraintProperties.Add(property); } } } if (primaryKeyProperties.Count() > 0) { entityType.SetPrimaryKey( primaryKeyProperties .OrderBy(p => _primaryKeyOrdinals[p.Name]) // note: for relational property p.Name is its columnId .ToList()); } else { var errorMessage = SqlServerDesignStrings.NoPrimaryKeyColumns( entityType.Relational().Schema, entityType.Relational().TableName); entityType.AddAnnotation(AnnotationNameEntityTypeError, errorMessage); Logger.LogWarning(errorMessage); } } AddForeignKeysToModel(relationalModel, entityTypeToForeignKeyConstraintsMap); }