Today we had an interesting effect in the CRM-System of one of our customers. In the CRM-System a Workflow is triggered on create and on change of a picklist value in the opportunity.
The workflow creates tasks.
At the same time a plugin is registered asynchronous on the post create event of the opportunity. The plugin sets an internal invisible value for some other processes.
What happened?
After creating a new opportunity we had the same Workflow running two times in the system creating a duplicate of the task.
Why does this happen?
I have to say, we migrated the plugin from an earlier callout of a CRM 3.0 system. Due to this we still had the following code in the plugin:

        Public Overrides Sub ExecutePlugin(ByVal context As _
                                     Microsoft.Crm.Sdk.IPluginExecutionContext)

            Dim cs As CrmService = Me.CrmService

            Dim opp As opportunity = DirectCast(cs.Retrieve(EntityName.opportunity.ToString, _
                       Me.CreatedInstanceId, _
                       New AllColumns), opportunity)

            Dim nextlfd As Integer = Me.GetNextCounter()
            If nextlfd > 0 Then
                opp.kl_eu_de_vcid = Date.Now.Year.ToString &
                                nextlfd.ToString.PadLeft(10, Convert.ToChar("0"))
                Dim counter As New CrmNumber
                counter.Value = nextlfd
                opp.kl_eu_de_vcidcounter = counter

                cs.Update(opp)
            Else
                Me.Log("Opportunity: Nächster freier Counter _
                                        konnte nicht ermittelt werden.", _
                                        EventLogEntryType.FailureAudit)
            End If

        End Sub

So what was the problem?
Using the New AllColumns has the effect that every value in the entity is read and if you send back this entity with the Update command you are writing over every value in the entity, also the picklist on which our workflow is listening is set.
It looks like the workflow setting OnChange is not really on change. It is on edit. Writing the same value into this field triggers the workflow.
So watch out if you are using New AllColumns