Entity framework 首先使用实体框架代码最有效地处理创建、更新和删除

Entity framework 首先使用实体框架代码最有效地处理创建、更新和删除,entity-framework,ef-code-first,dbcontext,entity-framework-5,Entity Framework,Ef Code First,Dbcontext,Entity Framework 5,注意:我使用的是实体框架版本5 在我的通用存储库中,我有如下添加、编辑和删除方法: public class EntityRepository<T> : IEntityRepository<T> where T : class, IEntity, new() { readonly DbContext _entitiesContext; public EntityRepository(DbContext entitiesContext) {

注意:我使用的是实体框架版本5

在我的通用存储库中,我有如下
添加
编辑
删除
方法:

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

用于添加:

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();
        }
分离仅影响传递给方法的特定对象。如果 正在分离的对象在对象上下文中具有相关对象,即 对象不会分离

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


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

如果要传递到
Add
Edit
方法的对象处于
distached
状态,会发生什么情况?这是否代替了在DbContext或存储库中具有
IDbSet
属性?这非常完美。非常感谢。
where E:class
的目的是什么?不确定谷歌能找到更多关于它的信息吗?@Cody这是一个约束,因此类型参数必须是引用类型@CoffeeAddict它是EF 5.0.0。DB first或Code first,我想这并不重要,因为这是一个通用的存储库代码。您可以使用新发布的库,它将自动设置实体图中所有实体的状态。你可以阅读。
 public bool Delete<E>(E entity) where E : class
        {
            DataContext.Entry(entity).State = System.Data.EntityState.Deleted;
            Save();
        }
private bool Save()
        {
            return DataContext.SaveChanges() > 0;                
        }