EF6では、共通フィールド/列を使用してエンティティを取得するための一般的なメソッドを作成する方法

StackOverflow https://stackoverflow.com//questions/20008329

質問

あなたは私の問題を説明するためのフレーズがあるとした後にタイトルが十分に啓発していれば申し訳ありませんでした。

それはこんな感じ: 私はEF6、データベースの最初のアプローチを使用しています。私のすべてのエンティティにはIDと有効なプロパティがあります。 私は私のDAL上にEDMXファイルを持っています、そして今私はビジネス層を設計する必要があります(私のためのBLL)。

DALから来ているデータがどのデータであるかを検証し、共通の演算子のためのインタフェースを作成することを決定したことを決定したことを決定する必要があるので、それを実装し、私のすべてのカスタムデータベーステーブルを持つ基本クラスを作成します。 \エンティティプロバイダはそれを継承します。

それが意味がない場合は、ここにしているものです。(すべてがBLLにあります)

public interface IEntityManager<T> where T : class {
        void Add(T e, bool commit=false);
        void Delete(T e);
        void DeleteByID(int id);
        void Update(T e);
        IQueryable<T> Search(Expression<Func<T, bool>> predicate);
        IQueryable<T> GetAll();
        T Get(int id);
    }
.

今、共通操作を実装する基本クラスはこれです。(読みやすさと簡潔さの編集)

 public class EntityManager<TEntity> : IDisposable, IEntityManager<TEntity> where TEntity : class {
        private readonly DbContext _ctx;
        private readonly DbSet<TEntity> _set;

        public EntityManager() {
            _ctx = new DomainModelFactory();
            _set = _ctx.Set<TEntity>();
        }

        public void Add(TEntity e) {
            _set.AddOrUpdate(e);
        }            

//other methods here

        public TEntity Get(int id) {
            return _set.Find(id);
        }


    }
.

実際にデータにアクセスしてアプリケーション全体で使用可能にするマネージャを作成するには、次のようなことを計画しています。

public class VenueManager: EntityManager<Venue> {
        public VenueManager():base()  {
        }
    }
.

私の会場エンティティを管理するクラスのために。

のようなものを使用する代わりにクラスを作成しています
var venueManager = new EntityManager<Venue>();
.

これらのクラスには特殊な方法があります。 私がこれまでにしたことを理解できることを理解できるようになることを願っています(そしてそれはうまくいきます)

今、私の問題はすべてのエンティティに2つの共通のフィールドがあることです.id(int)と有効(bool) IDで削除するとき、およびコードをコーディングしてGetやGetAllが必要な場合は、これらを使用しています。 有効なアイテムを取得します。さて、私はC&Pを作成することができるだけなので、私はC&Pコードを使うことができましたが、私は疑問に思っていましたが、EntityManagerクラスでこれをコーディングできる方法はあり、すべての管理者がその方法を継承しているがコンクリートを使用する方法があります。クラス?

このようなもの: EntityManagerクラス:

 public TEntity Get(int id) {
            return _set.Where(T.ID==id);
        }
.

基本的に私が欲しいもの:すべてのマネージャクラス(例のマネージャー)がこれらのメソッドを継承するように、基本クラス(EntityManager)でこれらのプロパティを使用する方法(メソッドDeleteManager)(メソッドDeleteManager、Get、Get Ant))私はそれらすべてを全体的に書く必要がありますか? (約100エンティティを入手)

役に立ちましたか?

解決

すべてのエンティティの基本クラスまたはインターフェースを定義する必要があります。

public class Entity {
    public int Id { get; set; }
    public bool Enabled { get; set; }
}
.

およびEntityManagerクラスには、where TEntity : Entity

のようなテンティティに一般的な制約を追加します。

その後、基本クラスId内の共通プロパティEnabledEntityManagerを使用できるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top