28

Uwaga: używam Entity Framework w wersji 5najskuteczniej obsługi Create, Update, Delete z kodem Entity Framework Pierwszy

Wewnątrz mojego rodzajowego repozytorium, mam Add, Edit i Delete metody jak poniżej :

public class EntityRepository<T> : IEntityRepository<T> 
    where T : class, IEntity, new() { 

    readonly DbContext _entitiesContext; 

    public EntityRepository(DbContext entitiesContext) { 

     if (entitiesContext == null) { 

      throw new ArgumentNullException("entitiesContext"); 
     } 

     _entitiesContext = entitiesContext; 
    } 

    //... 

    public virtual void Add(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State != EntityState.Detached) { 

      dbEntityEntry.State = EntityState.Added; 
     } 
     else { 

      _entitiesContext.Set<T>().Add(entity); 
     } 
    } 

    public virtual void Edit(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State == EntityState.Detached) { 

      _entitiesContext.Set<T>().Attach(entity); 
     } 

     dbEntityEntry.State = EntityState.Modified; 
    } 

    public virtual void Delete(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State != EntityState.Detached) { 

      dbEntityEntry.State = EntityState.Deleted; 
     } 
     else { 

      DbSet dbSet = _entitiesContext.Set<T>(); 
      dbSet.Attach(entity); 
      dbSet.Remove(entity); 
     } 
    } 
} 

Czy myślisz, czy te metody są dobrze wdrożone? Zwłaszcza metoda Add. Czy byłoby lepiej zastosować metodę Add jak poniżej?

public virtual void Add(T entity) { 

    DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
    if (dbEntityEntry.State == EntityState.Detached) { 

     _entitiesContext.Set<T>().Attach(entity); 
    } 

    dbEntityEntry.State = EntityState.Added; 
} 
+0

czy to przy użyciu Code First? – PositiveGuy

+1

@CoffeeAddict To EF 5.0.0. DB first lub Code first, nie ma znaczenia tutaj, jak sądzę, ponieważ jest to ogólny kod repozytorium. – tugberk

+0

Możesz użyć nowo wydanej biblioteki, która *** automatycznie ustawi stan wszystkich obiektów na wykresie encji ***. Możesz przeczytać [moja odpowiedź na podobne pytanie] (http://stackoverflow.com/questions/5557829/update-row-if-it-exists-else-insert-logic-with-entity-framework/39609020#39609020) . –

Odpowiedz

37

Do koszyka:

public bool Add<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Added; 
      Save(); 
     } 

Dla aktualizacji:

public bool Update<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Modified; 
      Save(); 
     } 

Dla usunięcia:

public bool Delete<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Deleted; 
      Save(); 
     } 

i prywatnym Save() metoda, która zwraca true lub false, dzięki czemu można łatwo awaryjne w kontrolerze w zależności od wyniku

private bool Save() 
     { 
      return DataContext.SaveChanges() > 0;     
     } 

Jest to tylko część mojego rodzajowego repozytorium. Działa doskonale w aplikacjach korporacyjnych.

UPDATE:

Odłączenie dotyczy jedynie konkretnego przekazywany do sposobu przedmiotu. Jeśli odłączany obiekt ma powiązane obiekty w kontekście obiektu, te obiekty nie są odłączane.

EF automatycznie przyłączy odłączone obiekty na wykresie podczas ustawiania stanu obiektu lub wywołania SaveChanges().

Naprawdę nie wiem, dlaczego musisz odrywać obiekty od kontekstu. Możesz także użyć AsNoTracking(), aby wczytać jednostki z bazy danych bez uprzedniego dołączania ich do kontekstu.

+0

Co się stanie, jeśli obiekt przechodzący do metody "Dodaj" lub "Edytuj" znajduje się w stanie "Oddzielny"? – tugberk

+0

Spójrz na zaktualizowaną w mojej odpowiedzi. –

+0

Dzięki za odpowiedź. – tugberk

Powiązane problemy