Esempio n. 1
0
 internal void Create(bool skipExistsCheck)
 {
     using (var clonedObjectContext = _internalContext.CreateObjectContextForDdlOps())
     {
         if (!skipExistsCheck &&
             _internalContext.DatabaseOperations.Exists(clonedObjectContext.ObjectContext))
         {
             throw Error.Database_DatabaseAlreadyExists(_internalContext.Connection.Database);
         }
         _internalContext.CreateDatabase(clonedObjectContext.ObjectContext);
     }
 }
        public DatabaseExistenceState AnyModelTableExists(InternalContext internalContext)
        {
            var exists = internalContext.DatabaseOperations.Exists(
                internalContext.Connection,
                internalContext.CommandTimeout,
                new Lazy<StoreItemCollection>(() => CreateStoreItemCollection(internalContext)));

            if (!exists)
            {
                return DatabaseExistenceState.DoesNotExist;
            }

            using (var clonedObjectContext = internalContext.CreateObjectContextForDdlOps())
            {
                try
                {
                    if (internalContext.CodeFirstModel == null)
                    {
                        // If not Code First, then assume tables created in some other way
                        return DatabaseExistenceState.Exists;
                    }

                    var checker = DbConfiguration.DependencyResolver.GetService<TableExistenceChecker>(internalContext.ProviderName);

                    if (checker == null)
                    {
                        // 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(checker, 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;
                }
            }
        }
 private static StoreItemCollection CreateStoreItemCollection(InternalContext internalContext)
 {
     using (var clonedObjectContext = internalContext.CreateObjectContextForDdlOps())
     {
         var entityConnection = ((EntityConnection)clonedObjectContext.ObjectContext.Connection);
         return (StoreItemCollection)entityConnection.GetMetadataWorkspace().GetItemCollection(DataSpace.SSpace);
     }
 }
Esempio n. 4
0
        internal void Create(DatabaseExistenceState existenceState)
        {
            using (var clonedObjectContext = _internalContext.CreateObjectContextForDdlOps())
            {
                if (existenceState == DatabaseExistenceState.Unknown)
                {
                    if (_internalContext.DatabaseOperations.Exists(clonedObjectContext.ObjectContext))
                    {
                        var interceptionContext = new DbInterceptionContext();
                        interceptionContext = interceptionContext.WithDbContext(_internalContext.Owner);
                        interceptionContext = interceptionContext.WithObjectContext(clonedObjectContext.ObjectContext);

                        throw Error.Database_DatabaseAlreadyExists(
                                  DbInterception.Dispatch.Connection.GetDatabase(_internalContext.Connection, interceptionContext));
                    }
                    existenceState = DatabaseExistenceState.DoesNotExist;
                }

                _internalContext.CreateDatabase(clonedObjectContext.ObjectContext, existenceState);
            }
        }