2012-04-20 46 views
1

我想在實體框架中做一個簡單的(或不是)數據訪問控制。我看到它在EF中不那麼容易支持,因爲EF實際上沒有很好的模式和視圖支持。實體框架中的數據訪問控制

我想有條件地訪問一些實體的列。

在Sql Server中,使用模式很容易實現。例如,我可以在他的架構中爲用戶創建一個視圖,其中有些列是錯過的。其他用戶(例如admin)將在其模式中包含所有列。它們都可以具有相同的視圖名稱,例如:getUsers,但是隻有將從dbo schema(dbo.getUsers)執行它的管理員將擁有所有列,而其他人只有一部分。當然,在Sql Server中,也可以通過存儲過程來實現。

如何在EF中實現數據訪問功能?

我要讓我將能夠使用這樣的功能:當然

-- function checks user role and returns appropirate columns/entity 
var result = getAppropirateDataForThisUser("getUsers", user); 

它只是爲了說明問題。用法可以完全不同。

回答

0

一兩件事你可以做的是創建一個邏輯的包裝流動站的DbContext過濾列相關用戶,

public class EfWrapper:Context 
{ 
private DbContext _dbContext; 

public EfWrapper(DbContext context){ 
    _dbContext=context; 
    } 

    public IEnumerable <User> getUsers(User user){ 

     //if ... write your logic to choose correct projection 
      var users= from user in context.Users 
      select new UserWithLessColumns 
       { 
        id= user.Id, 
        Name= user.Name 
       }); 
     return users; 
} 
} 
+0

當我有很多實體/視圖/過程時,可能很難處理。沒有更簡單的解決方案嗎?爲每個對象實現方法可能是個壞主意。我寧願過濾存儲過程或視圖在DB網站上的列... – nosbor 2012-04-20 16:47:23

+0

在這種情況下..是的。我認爲你需要在數據庫方面。 – 2012-04-20 16:50:00

+0

好的,但我如何在EF中處理它?我試圖通過db.ExecuteStoreQuery (@「execute」+ schema +「。」+ procName)來完成它。但是當我從模式中執行過程時,我收到較少的列,然後EF拋出異常,沒有足夠的列來執行此操作... – nosbor 2012-04-20 17:05:57

0

什麼條件過濾的目的是什麼?如果要顯示,請在上層應用程序圖層中進行處理。如果你實際上在討論不同的業務對象(即,一個用戶獲得一種類型的對象,另一個用戶獲取該對象的子類型),那麼你可以創建不同的類,並映射這些類,並使用代碼優先EF技術

EF是一個數據訪問組件,特別是一個對象關係映射器,即它將數據庫數據映射到業務對象,對嗎?

+0

是的,你理解正確。你有什麼建議,我怎麼能做到這一點? – nosbor 2012-04-22 14:32:43

+0

那麼你試圖公開不同的業務對象,或過濾器顯示? – 2012-04-23 18:20:51