Example #1
0
        public virtual IRdbmsStorageEntityDefinition CreateTableDefinition(ClassDefinition classDefinition)
        {
            ArgumentUtility.CheckNotNull("classDefinition", classDefinition);

            var tableName = _storageNameProvider.GetTableName(classDefinition);

            if (tableName == null)
            {
                throw new MappingException(string.Format("Class '{0}' has no table name defined.", classDefinition.ID));
            }

            var objectIDProperty = _infrastructureStoragePropertyDefinitionProvider.GetObjectIDStoragePropertyDefinition();
            var timestampProperty = _infrastructureStoragePropertyDefinitionProvider.GetTimestampStoragePropertyDefinition();
            var dataProperties = _storagePropertyDefinitionResolver.GetStoragePropertiesForHierarchy(classDefinition).ToList();
            var allProperties = new[] { objectIDProperty, timestampProperty }.Concat(dataProperties).ToList().AsReadOnly();

            var primaryKeyConstraints = CreatePrimaryKeyConstraints(classDefinition, allProperties);
            var foreignKeyConstraints = CreateForeignKeyConstraintsForTableDefinition(classDefinition, allProperties);

            return(new TableDefinition(
                       _storageProviderDefinition,
                       tableName,
                       _storageNameProvider.GetViewName(classDefinition),
                       objectIDProperty,
                       timestampProperty,
                       dataProperties,
                       primaryKeyConstraints.Concat(foreignKeyConstraints),
                       CreateIndexesForTableDefinition(classDefinition, allProperties),
                       CreateSynonymsForTableDefinition(classDefinition)));
        }
        public IEnumerable <ForeignKeyConstraintDefinition> CreateForeignKeyConstraints(ClassDefinition classDefinition)
        {
            var allClassDefinitionsInHierarchy = classDefinition
                                                 .CreateSequence(cd => cd.BaseClass)
                                                 .Concat(classDefinition.GetAllDerivedClasses());

            return((from classDefinitionInHierarchy in allClassDefinitionsInHierarchy
                    from endPointDefinition in classDefinitionInHierarchy.MyRelationEndPointDefinitions
                    where !endPointDefinition.IsVirtual
                    let referencedClassDefinition = endPointDefinition.ClassDefinition
                                                    .GetMandatoryRelationEndPointDefinition(endPointDefinition.PropertyName)
                                                    .GetOppositeClassDefinition()
                                                    let propertyDefinition = ((RelationEndPointDefinition)endPointDefinition).PropertyDefinition
                                                                             where propertyDefinition.StorageClass == StorageClass.Persistent
                                                                             let referencingStorageProperty =
                        (IObjectIDStoragePropertyDefinition)_persistenceModelProvider.GetStoragePropertyDefinition(propertyDefinition)
                        where referencingStorageProperty.CanCreateForeignKeyConstraint
                        let referencedTableName = FindTableName(referencedClassDefinition)
                                                  where referencedTableName != null
                                                  let referencedStoragePropertyDefinition = _infrastructureStoragePropertyDefinitionProvider.GetObjectIDStoragePropertyDefinition()
                                                                                            select referencingStorageProperty.CreateForeignKeyConstraint(
                            referencingColumns => _storageNameProvider.GetForeignKeyConstraintName(classDefinition, referencingColumns),
                            referencedTableName,
                            referencedStoragePropertyDefinition)
                    ).ToList());
        }