I'm using the asp.net SqlMembershipProvider and LinqToSql in a hobby/learning application. I have some user properties that I'm keeping in LinqtoSql, so my flow is: Membership.CreateUser -> MyClass.AddUserDetails. I'd like to wrap the whole thing in a transaction, so if the myclass bit fails I can roll back the membership bit. Any suggestions on how to do so?
A:
You can set the Transaction property of the DataContext to make it participate in a transaction you already have.
DamienG
2008-10-03 17:25:57
+1
A:
The providers don't explicitly support transactions, I asked for this feature some time ago:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=102268
I think if you use the TransactionScope class it should work, though you will have the overhead of an MSDTC-coordinated transaction.
Joe
2008-10-03 17:35:14
And the headaches of DTC. Getting it to work in a shared environment for example... sob...
Sklivvz
2008-10-03 17:36:55
+1
A:
My real life experience (happened more than once):
- Junior programmer writes a site.
- During code review, I catch the missing transaction between user creation and profile creation (typically with a custom SqlProvider)
- We wrap everything in a DTC transaction.
- Nothing works on junior programmer's computer.
- Fix DTC on junior programmer's computer.
- Deploy to shared hosting environment.
- Nothing works in hosting environment.
- Argue for 4 hours with hosting company trying to fix their DTC.
- Remove transaction because site has to go online.
- Pray.
I don't really like membership anymore...
Sklivvz
2008-10-03 17:42:02