J'ai une table User
et une table ClubMember
dans ma base de données. Il y a un mappage un-à-un entre les utilisateurs et les membres du club, donc chaque fois que j'insère un ClubMember
, je dois d'abord insérer un User
. Ceci est implémenté avec une clé étrangère sur ClubMember
(UserId REFERENCES User (Id)
).Besoin de conseils sur un scénario d'insertion complexe à l'aide de LinqToSql avec le modèle de référentiel
Dans mon application ASP.NET MVC, j'utilise LinqToSql et le modèle de référentiel pour gérer ma logique de persistance. De la façon dont j'ai actuellement implémenté cela, mes transactions User
et ClubMember
sont traitées par des classes de référentiel distinctes, chacune utilisant sa propre instance DataContext
.
Cela fonctionne très bien s'il n'y a pas d'erreurs de base de données, mais je suis préoccupé par le fait que je serai à User
enregistrements orphelins si des insertions ClubMember
échouent.
Pour résoudre ce problème, j'envisage de passer à un seul DataContext
, que je pourrais charger avec les deux inserts, puis appeler le DataContext.SubmitChanges()
une seule fois. Le problème avec ceci, cependant, est que le Id
pour User
n'est pas assigné jusqu'à ce que le User
soit inséré dans la base de données, et je ne peux pas insérer un ClubMember
jusqu'à ce que je connaisse le UserId
.
Questions:
Est-il possible d'insérer la
User
dans la base de données, obtenir leId
, puis insérez leClubMember
, tout comme une seule transaction (qui peut être annulée en cas de problème avec une partie de la transaction)? Si oui, comment? Si ce n'est pas le cas, mon seul recours est-il de supprimer manuellement les enregistrementsUser
orphelins qui ont été créés? Ou y a-t-il un meilleur moyen?
Aaron, bonne réponse, merci. Je me donne des coups de pied parce que j'avais initialement quelque chose de similaire à votre troisième extrait de code, mais au cours du débogage, j'en suis arrivé à la conclusion (incorrecte) que ça ne marcherait pas. Essayer à nouveau maintenant, cela fonctionne très bien. Deuxièmement, mes classes de dépôt sont basées sur NerdDinner, donc je blâme Scott Gu pour ma mise en œuvre moins que stellaire :). J'ai en fait un "todo" pour commencer à encapsuler mes instances 'DataContext' avec des instructions' using() ', et votre exemple me donne une bonne idée de la façon de procéder. – devuxer