2016-03-07 63 views
4

以下附錄是我創建的一種方法的示例。
我正確實施EF6嗎?正如你在我的評論代碼中看到的,我首先嚐試創建一個存儲庫類。我相反​​取消了此實現的存儲庫類。
但是我現在正在收到錯誤,因爲我返回了一個IQueryable對象,然後關閉了dbcontext。試圖找到EF6的正確實施方式

所以這讓我想到了一個問題:我是否正確實施了EF6?
我可以將IQueryable更改爲返回List<obj>,或者我可以刪除using (_myContext)語句。

我只是想了解實現我的方法的正確方法。

public IQueryable<MY_USERS> GetAllUsers() 
{ 
    using (_myContext) 
    { 
     return _myContext.MY_USERS; 
    } 
    //MyRepository<MY_USERS> users = new MyRepository<MY_USERS>(_myContext); 
    //return users.GetAll(); 
} 

更新例如:

public void DeleteUser(string userName) 
{ 
    using (var context = new MyEFConn()) 
    { 
     using (var transaction = context.Database.BeginTransaction()) 
     { 
      try 
      { 
       context.MY_USER_GROUPS.RemoveRange(GetUserGroups(userName)); 
       context.MY_USERS.Remove(new MY_USERS { USER_NAME = userName }); 
       transaction.Commit(); 
      } 
      catch (Exception ex) 
      { 
       transaction.Rollback(); 
       throw ex; 
      } 
     } 
    } 
} 
+2

返回'IQueryable'有很大的風險,因爲返回類型是延遲加載的,客戶端可以很容易地添加一個'Where'子句或SQL不支持的東西。從公共方法中返回列表是一般的最佳實踐。 –

+0

使用語句對於上下文甚至是必需的嗎?它似乎讓我更加頭痛,因爲我試圖利用現有的方法,並且使用(_myContext)語句包裝了所有的方法。 – PrivateJoker

+0

是的,你應該處理它(這是'使用')。如果處理上下文會導致問題,那意味着您仍然受限於上下文。答案是脫離上下文,而不是無限期地圍繞上下文。 –

回答

1

沒有任何錯誤或正確,它只是取決於。

當您使用IQueriable時,這意味着您可以在存儲庫類中進行常見查詢,並且可以在其外部添加其他過濾器。

GetAllUsers().Where(u=>u.UserType== 'Test').ToList() 

您還可以使用包括取決於你的需要讓說,在MVC控制器

GetAllUsers().Include(u=>u.Roles).Take(10).ToList(); 

重要的是要注意,EF不連接到數據庫,直到你做ToList()或者iterate扔查詢。

最後,正如你在評論中提到的,總是需要記住,當你使用IQuerieable時,上下文可以被處理,所以這也應該被考慮到。

另一方面可能是一個很好的選擇從庫中返回IEnumerable,因此可以說如果你想加載用戶你應該有方法,這將需要輸入參數分頁,過濾或其他的東西。這對測試非常有用,因爲您可以模擬數據。

關於刪除它總是取決於您的要求,如果您需要一起刪除所有或無需使用事務IN另外它可能與所有CRUD相同。

+0

謝謝大家的建議。看起來應該是處理上下文對象。 (在我的情況下,我沒有在每種方法中創建它的新實例)。至於返回類型,它可以作爲列表或IEnumerable或甚至IQuerable返回,具體取決於具體情況。 – PrivateJoker

+0

是的,我忘了提及處置。 –