Remarque: J'utilise Entity Framework version 5
Dans mon référentiel générique, j'ai les méthodes Add
, Edit
et Delete
comme ci-dessous:
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);
}
}
}
Pensez-vous que ces méthodes sont bien mises en œuvre? Surtout la méthode Add
. Serait-il préférable d'implémenter la méthode Add
comme ci-dessous?
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;
}
Pour ajouter:
public bool Add<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Added;
Save();
}
Pour la mise à jour:
public bool Update<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Modified;
Save();
}
Pour supprimer:
public bool Delete<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Deleted;
Save();
}
Et une méthode Save()
privée qui retourne vrai ou faux pour que vous puissiez facilement basculer dans le contrôleur en fonction du résultat
private bool Save()
{
return DataContext.SaveChanges() > 0;
}
Ce n'est qu'une partie de mon référentiel générique. Il fonctionne très bien dans les applications d'entreprise.
MISE À JOUR:
Détacher affecte uniquement l'objet spécifique transmis à la méthode. Si l'objet détaché a des objets associés dans le contexte de l'objet, ces objets ne sont pas détachés.
EF attachera automatiquement les objets détachés dans le graphique lors de la définition de l'état d'une entité ou lorsque SaveChanges()
est appelée.
Je ne sais vraiment pas pourquoi vous devez détacher des objets du contexte. Vous pouvez également utiliser AsNoTracking()
pour charger des entités à partir de la base de données sans les attacher au contexte en premier lieu.