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; } }