Hier gibt es keine Zauberei, Sie erhalten den Fehler, weil die Verbindung, die Sie beim Einfügen von CompanyAddress verwenden, nicht die ist, die Sie denken.
Es ist eine neue Verbindung. Wenn ComapnyPaymentInfo insert ausgeführt wird, verwenden Sie die Verbindung, die bereits mit Ihrer Transaktion verknüpft ist. Es stehen neue Befehle aus, da Sie im vorherigen Schritt gewartet haben.
Die Verwendung von Task.WhenAll() hingegen versucht, mehrere Threads zu verwenden. Wenn eine Verbindung damit beschäftigt ist, einen Befehl auszuführen, wird sie nicht verwendet und eine neue erzeugt.
Denken Sie daran, dass Ihnen bei der Verwendung von Transaktionen nur eine Verbindung zur Verfügung steht und Sie nicht von Parallelität profitieren können.