Marco de entidades de inserción de 3 tablas de la manera correcta y de reversión si excepción
-
20-12-2019 - |
Pregunta
Tengo una pregunta muy sencilla y estoy bangging mi cabeza sobre cómo hacerlo EXACTAMENTE.EL USO DE ENTITY FRAMEWORK Y TAMBIÉN TRATANDO DE MODELO DE REPOSITORIO AHORA Tengo 3 tablas:
Story id PRIMARY KEY IDENTITY
Album id PRIMARY KEY IDENTITY
Photo id PRIMARY KEY IDENTITY
Quiero INSERTAR una nueva historia como esta:
_db.Repository.Insert(oneStory);
Save(); // Save will save it to table story
oneStory.id; // return id of last added row.
A continuación, utilizando el id de la recientemente agregado historia que quiero guardar un álbum como este
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.
A continuación, utilizando el id de añadido recientemente álbum que desea guardar la foto como esta
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.
Aquí está el problema
- ¿Qué pasa si en el ahorro de un Álbum o foto excepción se produce , la historia ya está añadido, tal vez el álbum se agrega también, cómo deshacer y borrar esa historia o cambios?
- -Gran pregunta podemos obtener id de añadido recientemente fila sin Guardar() y por el sólo uso de insert?De esta manera puedo hacer todas las inserciones y también seguir recibiendo id y, a continuación, guardar en el final como UNIDAD DE TRABAJO.
Así que ¿alguien me guía aquí como se hace PERFECTO, lo que le ahorrará tiempo y con menos código y también una buena estructura.Gracias.
Solución
En el marco de entidades de la DbContext
es tanto repositorio y un unidad de trabajo.
Si usted quiere construir repositorios adicionales en la parte superior de eso, usted debe inyectar el DbContext
en ellos, de modo que todas las operaciones de uso de la misma DbContext
y usted solo llame SaveChanges
una vez.
En ese caso se debe utilizar las propiedades de navegación para enlazar los objetos uno al otro en lugar de la clave externa - ya que usted no tiene ninguna clave de valores todavía.EF insertará automáticamente las cosas en el orden correcto y asignar valores a las claves foráneas.
Si eso no es una opción, puede utilizar una TransactionScope
para envolver todo en una transacción:
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();
}