Подтвердить что ты не робот

Наиболее эффективная обработка кода создания, обновления, удаления с помощью Entity Framework First

Примечание. Я использую Entity Framework версии 5

Внутри моего общего репозитория у меня есть методы Add, Edit и Delete, как показано ниже:

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);
        }
    }
}

Считаете ли вы, хорошо ли эти методы реализованы? Особенно метод Add. Было бы лучше реализовать метод Add, как показано ниже?

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;
}
4b9b3361

Ответ 1

Для добавления:

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

Для обновления:

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

Для удаления:

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

И частный Save() метод, который возвращает true или false, чтобы вы могли легко избавиться от контроллера в зависимости от результата

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

Это только часть моего общего репозитория. Он отлично работает в корпоративных приложениях.

UPDATE:

Отключение влияет только на конкретный объект, переданный методу. Если объект, находящийся в стороне, имеет связанные объекты в контексте объекта, те объекты не отсоединяются.

EF автоматически присоединяет отдельные объекты в графе при настройке состояния объекта или при вызове SaveChanges().

Я действительно не знаю, почему вам нужно отделять объекты от контекста. Вы также можете использовать AsNoTracking() для загрузки объектов из базы данных, не вставляя их в контекст в первую очередь.