web-dev-qa-db-ja.com

Entity Framework Code Firstを使用した作成、更新、削除の最も効率的な処理

注: Entity Frameworkバージョン5を使用しています

汎用リポジトリ内には、次のようにAddEditおよび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;
}
28
tugberk

追加の場合:

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

Trueまたはfalseを返すプライベートSave()メソッド。結果に応じてコントローラーで簡単にフォールバックできます。

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

これは私の汎用リポジトリの一部にすぎません。エンタープライズアプリケーションで最適に機能します。

更新:

分離は、メソッドに渡される特定のオブジェクトにのみ影響します。切り離されるオブジェクトのオブジェクトコンテキストに関連オブジェクトがある場合、それらのオブジェクトは切り離されません。

EFは、エンティティの状態を設定するとき、またはSaveChanges()が呼び出されるときに、グラフ内の分離オブジェクトを自動的にアタッチします。

コンテキストからオブジェクトを切り離す必要がある理由は本当にわかりません。 AsNoTracking()を使用して、最初にコンテキストにエンティティをアタッチせずに、データベースからエンティティをロードすることもできます。

37
Matija Grcic