2016-04-22 28 views
-1

のインターフェイスはMstTuverクラスで実装されています。 IMstTuverは、MaxVersionおよびAgenttypeパラメータを含む。私のクラスでEntity Frameworkを使用したDBContextのジェネリック

public class GetTable<T> where T : IMstTuver 
{ 
    public IMstTuver GetEntities(DbContext context, string agenttype) 
    { 
     long maxVersion = context.Set<T>().Max(x => x.MaxVersion); 
     IMstTuver mstTuver = context.Set<T>() 
            .Where(x => x.MaxVersion == maxVersion && 
               x.AgentType == agenttype) 
            .FirstOrDefault(); 
     return mstTuver; 
    } 
} 

は:

table.GetEntities(MyDbContext, "MSMA") as MstTuver; 

私はパラメーター「TEntity」のようにそれを使用するために

型「T」がなければなりません参照型のエラーを取得していますジェネリック型またはメソッド 'System.Data.Entity.DbSet'

助けてください。

答えて

1

あなたはあなたの方法にclass型制約を追加することにより、参照型としてTを宣言することができます。

public class GetTable<T> where T : class, IMstTuver 
{ 
    //... 
2

Set<T>は、あなたのクラスが必要であることを意味し、Tが参照型である必要があり、一般的な制約があります1つも持っている。私は過去にこのような何かを行われ、それが簡単な方法で、一般的な制約を置くことを発見した

public class GetTable<T> where T : class, IMstTuver 
0

:修正は、すべての一般的なクラスおよび/またはメソッド呼び出しチェーンをに次の修正を適用することですタイプよりも。これにより、同じリポジトリタイプが(制約を満たす限り)複数のエンティティタイプに対応することができます。

例:将来的には

public class GetTable 
{ 
    public T GetEntities<T>(DbContext context, string agenttype)where T : class, IMstTuver 
    { 
     long maxVersion = context.Set<T>().Max(x => x.MaxVersion); 
     IMstTuver mstTuver = context.Set<T>().Where(x => x.MaxVersion == maxVersion && x.AgentType == agenttype).FirstOrDefault(); 
     return mstTuver; 
    } 
} 

、あなたが呼び出しているメソッドに制約をチェックし、それらの同じ制約を実装することができ、既存のライブラリからジェネリックなどの一般的なを戻ってきています。この場合、Set<T>メソッドはクラスに制約されます。次に、矛盾しない制約を追加することができます。まず

DbContext.Set Method

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class 
+0

、これは彼の問題ではなく、第二これはまた、彼のエラーになります; D –

+0

@FrerkMorrin - エラーを修正。 – Igor

関連する問題