Creazione di un nuovo progetto MVC e come l'idea di repository nel livello dati, quindi li ho implementati. Ho anche creato un livello di servizio per gestire tutta la logica e la convalida aziendale, questo strato a sua volta utilizza il repository appropriato. Qualcosa di simile a questo (sto usando iniettore semplice per iniettare)Entity Framework 6 e Unit of Work ... Dove, Quando? È come le transazioni in ado.net?
DAL STRATO
public class MyRepository {
private DbContext _context;
public MyRepository(DbContext context) {
_context = context;
}
public MyEntity Get(int id)
{
return _context.Set<MyEntity>().Find(id);
}
public TEntity Add(MyEntity t)
{
_context.Set<MyEntity>().Add(t);
_context.SaveChanges();
return t;
}
public TEntity Update(MyEntity updated, int key)
{
if (updated == null)
return null;
MyEntity existing = _context.Set<MyEntity>().Find(key);
if (existing != null)
{
_context.Entry(existing).CurrentValues.SetValues(updated);
_context.SaveChanges();
}
return existing;
}
public void Delete(MyEntity t)
{
_context.Set<MyEntity>().Remove(t);
_context.SaveChanges();
}
}
livello di servizio
public class MyService {
private MyRepository _repository;
public MyService(MyRepository repository) {
_repository = repository;
}
public MyEntity Get(int id)
{
return _repository.Get(id);
}
public MyEntity Add(MyEntity t)
{
_repository.Add(t);
return t;
}
public MyEntity Update(MyEntity updated)
{
return _repository.Update(updated, updated.Id);
}
public void Delete(MyEntity t)
{
_repository.Delete(t);
}
}
Ora questo è molto semplice, in modo che io possa utilizzare il seguente codice per aggiornare un oggetto.
MyEntity entity = MyService.Get(123);
MyEntity.Name = "HELLO WORLD";
entity = MyService.Update(entity);
O questo per creare un oggetto
MyEntity entity = new MyEntity();
MyEntity.Name = "HELLO WORLD";
entity = MyService.Add(entity);
// entity.Id is now populated
Ora dire che ho bisogno di aggiornare un elemento basato sulla creazione Id di un altro, ho potuto utilizzare il codice di cui sopra tutti bene, ma che cosa succede se un si verifica un errore? Ho bisogno di una sorta di transazione/rollback. È questo che supponiamo che il modello dell'Unità di lavoro risolva?
Quindi suppongo di aver bisogno di avere DbContext nel mio oggetto UnitOfWork, quindi creo un oggetto come questo?
public class UnitOfWork : IDisposable {
private DbContext _context;
public UnitOfWork(DbContext context) {
_context = context;
}
public Commit() {
_context.SaveChanges();
}
public Dispose() {
_context.Dispose();
}
}
Ok così ancora, questo è abbastanza semplice. UnitOfWork mantiene anche il contesto (io uso lo stesso contesto in tutti i repository) e chiama il metodo SaveChanges(). Quindi rimuoverei la chiamata al metodo SaveChanges() dal mio repository. Quindi aggiungere vorrei fare quanto segue:
UnitOfWork uow = new UnitOfWork(new DbContext()); // i would inject this somehow
MyEntity entity = new MyEntity();
MyEntity.Name = "HELLO WORLD";
entity = MyService.Add(entity);
uow.Commit();
Ma cosa succede se ho bisogno di creare un oggetto e quindi aggiornare altri oggetti basati su tale Id, questo ora non funziona, perché l'ID non verrà creato fino a quando ho chiama Commit sul uow. Esempio
UnitOfWork uow = new UnitOfWork(new DbContext()); // i would inject this somehow
MyEntity entity = new MyEntity();
MyEntity.Name = "HELLO WORLD";
entity = MyService.Add(entity);
// entity.Id is NOT populated
MyEntity otherEntity = MyService.Get(123);
otherEntity.OtherProperty = entity.Id;
MyService.Update(otherEntity);
uow.Commit(); // otherEntity.OtherProperty is not linked.....?
Così ho la sensazione che questa classe UnitOfWork non è giusto ... forse io sono la signorina comprensione qualcosa.
Devo essere in grado di aggiungere un'entità e ottenere quell'ID e usarlo su un'altra entità, ma se si verifica un errore, voglio eseguire il "rollback" come farebbe una transazione ado.net.
Questa funzionalità è possibile utilizzando Entity Framework e repository?
grazie per aver spiegato e fornito un esempio. Consigli presi – Gillardo
@ ken2k per quanto riguarda 'Separazione delle preoccupazioni' e' Database Domain Enotostic Layer'? – tchelidze
@tchelidze E riguardo a loro? –