entity-framework - 使用 Entity Framework 代码最有效地处理创建、更新、删除

标签 entity-framework ef-code-first dbcontext entity-framework-5

Note: I am using Entity Framework version 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);
        }
    }
}

您认为这些方法是否实现得很好?尤其是 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;
}

最佳答案

添加:

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

和私有(private) Save()返回 true 或 false 的方法,因此您可以根据结果在 Controller 中轻松回退
private bool Save()
        {
            return DataContext.SaveChanges() > 0;                
        }

这只是我的通用存储库的一部分。它在企业应用程序中效果很好。

更新:

Detach only affects the specific object passed to the method. If the object being detached has related objects in the object context, those objects are not detached.



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

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

关于entity-framework - 使用 Entity Framework 代码最有效地处理创建、更新、删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742473/

相关文章:

asp.net-mvc - 代码首次迁移 : read sql from file

c# - Entity Framework 代码先: should be used as a production technique or it's only for test purposes?

sql - 将原始 SQL 结果映射到 .NET Core 中的对象列表

entity-framework - 在 EF 4.1 中使用 DbContext 和数据库优先

c# - 基于接口(interface)的全局过滤器

c# - Oracle .Net 托管数据访问错误 : Could not load type 'OracleInternal.Common.ConfigBaseClass' from assembly

visual-studio - 在所选文件中找不到从 DbContext 派生的可构造类型(EF Power Tools Beta 3/Visual Studio 2012)

c# - 我是否需要在表示层中添加对 EntityFramework.SqlServer 的引用?

entity-framework-4 - DbContext SaveChanges 语句执行顺序

c# - 如何使用 View 模型