2017-11-07 10 views
0

ここで私の給与計算を上回っているかもしれませんが、私はEFプロジェクト用の汎用CRUDルーチンを作成しようとしています。私はそれの仕事のほとんどを持っているが、私は1つのポイントで周りを揺るがしている。汎用クラスでエンティティフレームワークを設定

は、通常は正常に動作し、コンテキスト

DBContext.MyClass.Add(p); // p = instance of MyClass 

を通じてエンティティを追加するには、このような何かを行うが、すべてを処理するためのグローバルな方法であるためには関係なく、彼らは私が渡しているが何であるか、クラスの追加しますオブジェクトとしてモデルは、それがよりthis-

DBContext<whateverobject>.Add(whateverobject); // my objects is an object param passed into the method 

のようになります。私はそこtypeofsとTの束やって試してみた:クラスのものを、私は運がありませんよ。正しい方向を指していると私を助けるだろう。

私は私のオプションも

おかげEF 6より限定されたかもしれませんEFコア2を使用しています。

public class Repo<T> where T: class 
{ 
    private readonly DbSet<T> _set; 

    public Repo(DbContext dbContext) 
    { 
     _set = dbContext.Set<T>(); 
    } 

    public void Add(T entity) => _set.Add(entity); 
} 

この例では、多分珍しいものが含まれています

+1

はこのメイクセンスを行います。https://stackoverflow.com/questions/30675564/in-entity-framework-how-do-i-add-a-generic-entity-対応するdbset-wi –

+0

Erik、私はそれが正しい軌道に乗せてくれると思います。あなたがそれを答えとして言えば、私はあなたにそれを与えるでしょう。 – infocyde

+1

最初に試してみると、私はそれに答えるでしょう:)他の人がこれを見つけて間違って使うことができないようにしたくありません。 –

答えて

3

あなたが探している方法は、次のようになり、あなたの一般的なCRUDのためのDbContextさんSet<T>()

あなたの一般的なリポジトリです。

where T: classTは参照型である必要があります。DbSet<T> expects T to be a reference type


一般的なクエリでは、拡張メソッドを使用することができます。 ByIdメソッドを実装するには、タイプTにインターフェイスを使用してIdプロパティが必要であることを指定する必要があります。それは次のようになります。

public interface IEntity 
{ 
    int Id { get; set; } 
} 

public class User : IEntity 
{ 
    public int Id { get; set; } 
} 

public static class DbSetExtensions 
{ 
    public static T ById<T>(this DbSet<T> dbSet, int id) where T: class => 
     dbSet.FirstOrDefault(entity => entity.Id == id); 
} 
+0

これは素晴らしい答えですが、私は昨日正しい方向に私を指摘したエリック・フィリップスに答えを与えると約束しました。しかし、これを行う方法を探している人にとっても、良い出発点です。 – infocyde

+0

賛辞をありがとう。私はあなたの問題を解決できることを願っています –

関連する問題