Ejemplo n.º 1
0
        public virtual void RegisterContext(DataModelProvider dataModelProvider, ContextConfiguration configuration)
        {
            if (dataModelProvider == null)
            {
                throw new ArgumentNullException("dataModelProvider");
            }

            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            if (_registerGlobally)
            {
                CheckForRegistrationException();
            }

            // check if context has already been registered
            if (_contextTypes.Contains(dataModelProvider.ContextType))
            {
                throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.MetaModel_ContextAlreadyRegistered, dataModelProvider.ContextType.FullName));
            }

            try {
                IEnumerable <TableProvider> tableProviders = dataModelProvider.Tables;

                // create and validate model
                var tablesToInitialize = new List <MetaTable>();
                foreach (TableProvider tableProvider in tableProviders)
                {
                    RegisterMetadataTypeDescriptionProvider(tableProvider, configuration.MetadataProviderFactory);

                    MetaTable table = CreateTable(tableProvider);
                    table.CreateColumns();

                    var    tableNameAttribute = tableProvider.Attributes.OfType <TableNameAttribute>().SingleOrDefault();
                    string nameOverride       = tableNameAttribute != null ? tableNameAttribute.Name : null;
                    table.SetScaffoldAndName(configuration.ScaffoldAllTables, nameOverride);

                    CheckTableNameConflict(table, nameOverride, tablesToInitialize);

                    tablesToInitialize.Add(table);
                }

                _contextTypes.Add(dataModelProvider.ContextType);

                if (_registerGlobally)
                {
                    MetaModelManager.AddModel(dataModelProvider.ContextType, this);
                }

                foreach (MetaTable table in tablesToInitialize)
                {
                    AddTable(table);
                }
                // perform initialization at the very end to ensure all references will be properly registered
                foreach (MetaTable table in tablesToInitialize)
                {
                    table.Initialize();
                }
            }
            catch (Exception e) {
                if (_registerGlobally)
                {
                    s_registrationException = e;
                }
                throw;
            }
        }