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.

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top