Entity framework inserimento di 3 tabelle nel modo giusto e rollback in caso di eccezione
-
20-12-2019 - |
Domanda
Ho una domanda molto semplice e io sono bangging la mia testa su come fare ESATTAMENTE a destra.L'UTILIZZO DI ENTITY FRAMEWORK E ANCHE CERCANDO REPOSITORY PATTERN ORA Ho 3 tabelle:
Story id PRIMARY KEY IDENTITY
Album id PRIMARY KEY IDENTITY
Photo id PRIMARY KEY IDENTITY
Voglio INSERIRE una nuova storia come questa:
_db.Repository.Insert(oneStory);
Save(); // Save will save it to table story
oneStory.id; // return id of last added row.
Quindi utilizzando l'id di recente aggiunto la storia che voglio salvare un album come questo
oneAlbum.fk_storyid=oneStory.id
_db.Repository.Insert(oneAlbum);
Save(); // Save will save it to table album
oneAlbum.id; // return id of last added row.
Quindi, utilizzando id aggiunto di recente album voglio salvare la foto come questa
onePhoto.fk_albumid=oneAlbum.id
_db.Repository.Insert(onePhoto);
Save(); // Save will save it to table photo
onePhoto.id; // return id of last added row.
Qui è il problema
- Cosa succede se il salvataggio di un Album o foto eccezione si verifica , la storia è già aggiunto, forse l'album è aggiunto anche, come per il ripristino e cancellare quella storia o modifiche?
- -Grande domanda che si può ottenere id recentemente aggiunta una riga senza Salvare() e utilizzando semplicemente inserire?In questo modo posso fare tutti gli inserti e anche mantenere sempre id e quindi salvare, alla fine, come UNITÀ DI LAVORO.
Così può un po ' una guida per me, qui, come si è fatto PERFETTO che farà risparmiare tempo e meno codice e di una buona struttura.Grazie.
Soluzione
In Entity framework DbContext
di per sé è un repository e un unità di lavoro.
Se si vuole costruire un repository aggiuntivi in cima a quello, si dovrebbe iniettare il DbContext
in modo che tutte le operazioni di utilizzare lo stesso DbContext
e si chiamare solo SaveChanges
una volta.
In questo caso si dovrebbe utilizzare le proprietà di navigazione per collegare gli oggetti a vicenda invece di foreign key - poiché non si dispone di eventuali valori di chiave di sicurezza.EF inserirà automaticamente le cose nel giusto ordine e di assegnare i valori alle chiavi esterne.
Se questo non è un'opzione, è possibile utilizzare un TransactionScope
per avvolgere tutto in una transazione:
using(var tx = new TransactionScope())
{
_db.Repository.Insert(oneStory);
Save(); // Save will save it to table story
oneStory.id; // return id of last added row.
_db.Repository.Insert(oneStory);
Save(); // Save will save it to table story
oneStory.id; // return id of last added row.
onePhoto.fk_albumid=oneAlbum.id
_db.Repository.Insert(onePhoto);
Save(); // Save will save it to table photo
onePhoto.id; // return id of last added row.
tx.Complete();
}