1

是否可以使用預編譯的linq查詢與存儲庫。現在我有我的資料庫建立像在EF中使用預編譯的linq查詢與存儲庫模式

public class CustomerRepository : EntityRepository 
{ 
    private readonly IContext _context; 
    public CustomerRepository(UnitOfWork uow) 
     { 
      _context = uow.context; 
     } 
} 

我將能夠通過我的實際上下文類MyEntities創建以下方式預編譯查詢:ObjectContext的,IContext。

static Func<ObjectContext, int, Customer> _custByID; 

public static Customer GetCustomer(int ID) 
{ 
    if (_custByID == null) 
    { 
    _custByID = CompiledQuery.Compile<MyEntities, int, Customer> 
    ((ctx, id) => ctx.Customers.Where(c => c.CustomerID == id).Single()); 
    } 
    return _custByID.Invoke(_context, ID); 
} 

問題是編譯方法TArg0需要一個從ObjectContext派生的類型。由於使用IContext使用存儲庫的全部目的是使用上面的代碼來隱藏與實體框架相關的代碼,這是沒有意義的。我應該如何去使用預編譯的linq查詢。我應該將它們移動到一個單獨的類庫中,它引用了我的模型和實體框架,還是我對庫的理解不正確?我在一個ASP.net應用程序中使用EF4。

回答

3

存儲庫實現應該具備數據訪問技術的知識。存儲庫的責任是與底層數據源交談以滿足合同。如果由於ObjectSet已經是存儲庫而無法執行此類優化,那麼擁有存儲庫將毫無用處。在存儲庫和EF之間創建另一個間接層是一種無用的抽象。

+0

有道理。我相信我主要關心的是測試。我一直在使用假上下文來測試我的存儲庫功能。我相信我將無法使用預編譯的linq查詢來測試我的存儲庫函數,而不會觸及數據strore? – nighthawk457

+0

@ nighthawk457涉及EF的代碼未經過單元測試,但進行了集成測試。見[這個問題](http://stackoverflow.com/questions/5609508/asp-net-mvc3-and-entity-framework-code-first-architecture) – Eranga