我做我所做的最終原因是爲DbContext
提供了一些緩存功能。爲了實現這一點,我試圖通過覆蓋上下文中的Set<T>()
方法來擴展默認DbSet
功能,並返回直接從通用DbSet
類派生的類型對象。就像這樣:EF6:從派生DbSet獲取數據
public class Context : DbContext
{
...
public override DbSet<TEntity> Set<TEntity>()
{
//var set = base.Set<TEntity>();
var set = new XxSet<TEntity>();
return set;
}
}
class XxSet<TEntity> : System.Data.Entity.DbSet<TEntity>
where TEntity : class
{
public override TEntity Find(params object[] keyValues)
{
return base.Find(keyValues);
}
}
看起來簡單明瞭,但是當我在這個運行我的測試中,EF給我一個錯誤:
The member 'IQueryable.Provider' has not been implemented on type 'XxSetˊ1' which inherits from 'DbSetˊ1'. Test doubles for 'DbSetˊ1' must provide implementations of methods and properties that are used.
它要求我執行的IQueryable接口。這是我明白,但爲什麼?它不應該已經在基類中實現了嗎? 我想它必須,否則,將如何工作Set<T>()
方法的基本功能,該方法返回的對象由System.Data.Entity.DbSet<TEntity>
類型實例化。
我在這裏錯過了什麼嗎?
順便說一句。我知道關於創建內存中DbSets的Microsoft示例。我只是想明白爲什麼我不能這麼簡單。
我不知道爲什麼它不工作,這看起來像是可以做的事情,但實體不喜歡它,在這個鏈接:http://stackoverflow.com/questions/21069986/nsubstitute- dbset-iqueryablet也有類似的錯誤,對不起,如果它根本沒有幫助你 –
嗯,它實際上幫助了我。我錯過了'DbSet'中顯式'IQueryable'實現的事實。感謝您的鏈接。 – drty