2016-04-22 41 views
-1

我有一個接口IMstTuver,它由MstTuver類實現。 IMstTuver包含MaxVersionAgenttype參數。使用實體框架的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; 

我得到一個錯誤

類型「T」必須是引用類型,以便用它作爲參數「TEntity」泛型類型或方法'System.Data.Entity.DbSet'

請幫忙。

回答

1

您可以通過添加class類型約束你的方法聲明T爲引用類型:

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

Set<T>有一個通用的約束,即T必須是引用類型,這意味着你的類需要也有一個。解決方法是以下修改適用於所有的通用類和/或方法了調用鏈:

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