2016-01-22 79 views
1

我有一個問題,CRUD操作的通用信息庫,我想從我的泛型類得到表:錯誤關於實施使用實體框架

public virtual TEntity GetById(int id) 
{ 
    return _db.Set<TEntity>().FirstOrDefault(c => ((IEntity)c).Code == id); 
} 

Linq不能施放IEntity

public abstract class BaseRepository<TEntity, M> : IRepository<TEntity> where TEntity : class where M : new() 

如果替換TEntity : class與​​我收到此錯誤:

類型「TEntity」必須是引用類型,以便在通用類型或方法使用它作爲參數「TEntity」「System.Data.Entity.DbContext.Set()」

回答

1

需要指定兩個通用的限制,你已經擁有(class)指定類型參數必須是引用類型和接口約束指定TEntity必須實現您的IEntity接口:

                       ^^here^^ 
public abstract class BaseRepository<TEntity, M> : IRepository<TEntity> where TEntity : class, IEntity where M : new() 

之後,你應該能夠這樣做:

public virtual TEntity GetById(int id) 
{ 
    return _db.Set<TEntity>().FirstOrDefault(c => c.Code == id); 
} 

但無論如何,我想,如果你正在創建一個通用的庫建議,您GetById方法應該是「更靈活」,例如,你可以做到以下幾點:

public virtual TEntity Find(params object[] keyValues) 
{ 
    return _db.Set<TEntity>().Find(keyValues); 
} 
+0

謝謝,它完美地工作! – user1545810