One way to do this is to start a transaction, insert into the audit table, then do the update. By using a transaction, you ensure that both changes are made successfully, or nothing happens at all (don't want an audit record when there is no change, or a change when you can't create an audit record.

You can do this either in C# code, or by using a stored procedure. There is no need to actually fetch the old data first, just insert it directly.