29

注: 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;
}
4

1 に答える 1

37

追加する場合:

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

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

アップデート:

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

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

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

于 2012-10-05T09:00:12.643 に答える