Hi Kelly,
I assume you added the code in SFDC because your sales reps were not adding contact roles to their opportunities. This is a problem for first- and multi-touch attribution reporting in Program Opportunity Analysis as the link between the program touching the lead and the opportunity is missing. We built a feature to address this by "implicitly" linking all contacts in an account to the opportunity. See https://community.marketo.com/MarketoArticle?id=kA050000000LBSxCAO for more details.
For the model issue. if you're using the "Added to Opportunity" trigger, one solution is to add a constraint on Is Primary or Role to move only the main contact. Interestingly, some customers actually want the behavior you described. I'm curious to know why you don't want the other contacts in the SQL stage?
TJ