diff --git a/lib/dm-core/resource.rb b/lib/dm-core/resource.rb
index <HASH>..<HASH> 100644
--- a/lib/dm-core/resource.rb
+++ b/lib/dm-core/resource.rb
@@ -369,7 +369,8 @@ module DataMapper
     #
     # @api public
     def destroy!
-      if saved? && repository.delete(Collection.new(query, [ self ])) == 1
+      if saved? && !destroyed?
+        repository.delete(collection_for_self)
         @destroyed = true
         @collection.delete(self) if @collection
         reset
@@ -617,7 +618,7 @@ module DataMapper
     # @api private
     def collection
       return @collection if @collection || new? || frozen?
-      @collection = Collection.new(query, [ self ])
+      @collection = collection_for_self
     end
 
     protected
@@ -748,6 +749,16 @@ module DataMapper
       Query.new(repository, model, model.key_conditions(repository, key))
     end
 
+    # Return a collection including the current resource only
+    #
+    # @return [Collection]
+    #   a collection containing self
+    #
+    # @api semipublic
+    def collection_for_self
+      Collection.new(query, [ self ])
+    end
+
     # TODO: document
     # @api private
     def parent_relationships
@@ -861,7 +872,7 @@ module DataMapper
         # remove from the identity map
         identity_map.delete(key)
 
-        return false unless repository.update(dirty_attributes, Collection.new(query, [ self ])) == 1
+        repository.update(dirty_attributes, collection_for_self)
 
         # remove the cached key in case it is updated
         remove_instance_variable(:@key)
Resource#update and Resource#destroy should be idempotent

* The resource may have already been modified or destroyed elsewhere
  in the system, so checking the return values of the adapter
  method is unecessary.  If the method does not raise an exception we
  should assume it was successful.