Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
                }
            }
        }