最有效地处理创建,更新,删除实体框架代码优先

tug*_*erk 28 entity-framework ef-code-first dbcontext entity-framework-5

注意:我使用的是Entity Framework第5版

在我的通用库,我有Add,EditDelete下面的方法:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您认为这些方法是否得到了很好的实施?特别是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;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*cic 37

添加:

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

更新:

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

删除:

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

还有一个Save()返回true或false 的私有方法,因此您可以根据结果轻松地在控制器中回退

private bool Save()
        {
            return DataContext.SaveChanges() > 0;                
        }
Run Code Online (Sandbox Code Playgroud)

这只是我的通用存储库的一部分.它在企业应用程序中非常有用.

更新:

分离仅影响传递给方法的特定对象.如果正在分离的对象在对象上下文中具有相关对象,则不会分离这些对象.

设置实体的状态或SaveChanges()调用时,EF将自动附加图中的分离对象.

我真的不知道你为什么需要从上下文中分离对象.您还可以使用AsNoTracking()从数据库加载实体,而无需首先将它们附加到上下文中.

  • @Cody它是一个约束因此类型参数必须是引用类型http://msdn.microsoft.com/en-us/library/d5x73970.aspx (4认同)