Exemple #1
0
        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);
        }