public bool AnyModelTableExists(InternalContext internalContext) { using (var clonedObjectContext = internalContext.CreateObjectContextForDdlOps()) { var exists = internalContext.DatabaseOperations.Exists(clonedObjectContext.ObjectContext); if (!exists) { return(false); } try { if (internalContext.CodeFirstModel == null) { return(true); } var providerName = internalContext.ProviderName; IPseudoProvider provider; switch (providerName) { case "System.Data.SqlClient": provider = new SqlPseudoProvider(); break; case "System.Data.SqlServerCe.4.0": provider = new SqlCePseudoProvider(); break; default: return(true); } var modelTables = GetModelTables(internalContext.ObjectContext.MetadataWorkspace).ToList(); if (!modelTables.Any()) { return(true); } using (new TransactionScope(TransactionScopeOption.Suppress)) { if (provider.AnyModelTableExistsInDatabase( clonedObjectContext.ObjectContext, clonedObjectContext.Connection, modelTables, EdmMetadataContext.TableName)) { return(true); } } return(internalContext.HasHistoryTableEntry()); } catch (Exception ex) { Debug.Fail(ex.Message, ex.ToString()); // Revert to previous behavior on error return(true); } } }
public bool AnyModelTableExists(DbContext context) { try { var internalContext = context.InternalContext; if (internalContext.CodeFirstModel == null) { return(true); } var providerName = internalContext.ProviderName; IPseudoProvider provider; switch (providerName) { case "System.Data.SqlClient": provider = new SqlPseudoProvider(); break; case "System.Data.SqlServerCe.4.0": provider = new SqlCePseudoProvider(); break; default: return(true); } // Check for a history entry before we query the DB metadata if (internalContext.HasHistoryTableEntry()) { return(true); } var modelTables = GetModelTables(internalContext.ObjectContext.MetadataWorkspace).ToList(); if (!modelTables.Any()) { return(true); } IEnumerable <Tuple <string, string> > databaseTables; using (new TransactionScope(TransactionScopeOption.Suppress)) { using (var clonedObjectContext = internalContext.CreateObjectContextForDdlOps()) { databaseTables = GetDatabaseTables( clonedObjectContext.ObjectContext, clonedObjectContext.Connection, provider).ToList(); } } if (databaseTables.Any( t => t.Item2 == EdmMetadataContext.TableName)) { return(true); } var comparer = provider.SupportsSchemas ? EqualityComparer <Tuple <string, string> > .Default : (IEqualityComparer <Tuple <string, string> >) new IgnoreSchemaComparer(); return(databaseTables.Any(databaseTable => modelTables.Contains(databaseTable, comparer))); } catch (Exception ex) { Debug.Fail(ex.Message, ex.ToString()); // Revert to previous behavior on error return(true); } }
public DatabaseExistenceState AnyModelTableExists(InternalContext internalContext) { using (var clonedObjectContext = internalContext.CreateObjectContextForDdlOps()) { var exists = internalContext.DatabaseOperations.Exists(clonedObjectContext.ObjectContext); if (!exists) { return(DatabaseExistenceState.DoesNotExist); } try { if (internalContext.CodeFirstModel == null) { // If not Code First, then assume tables created in some other way return(DatabaseExistenceState.Exists); } var providerName = internalContext.ProviderName; IPseudoProvider provider; switch (providerName) { case "System.Data.SqlClient": provider = new SqlPseudoProvider(); break; case "System.Data.SqlServerCe.4.0": provider = new SqlCePseudoProvider(); break; default: // If we can't check for tables, then assume they exist as we did in older versions return(DatabaseExistenceState.Exists); } var modelTables = GetModelTables(internalContext).ToList(); if (!modelTables.Any()) { // If this is an empty model, then all tables that can exist (0) do exist return(DatabaseExistenceState.Exists); } if (QueryForTableExistence(provider, clonedObjectContext, modelTables)) { // If any table exists, then assume that this is a non-empty database return(DatabaseExistenceState.Exists); } // At this point we know no model tables exist. If the history table exists and has an entry // for this context, then treat this as a non-empty database, otherwise treat is as existing // but empty. return(internalContext.HasHistoryTableEntry() ? DatabaseExistenceState.Exists : DatabaseExistenceState.ExistsConsideredEmpty); } catch (Exception ex) { Debug.Fail(ex.Message, ex.ToString()); // Revert to previous behavior on error return(DatabaseExistenceState.Exists); } } }