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.

È stato utile?

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top