2010-08-28 55 views
1

實體框架允許輕鬆地將存儲過程的結果映射到實體。我需要的是一個實體映射到輸入參數,以便不用實體框架功能導入:輸入參數映射

context.SaveUser(user.FirstName, user.LastName, ...); 

我可以簡單地這樣稱呼它:

context.SaveUser(user); 

我真正想要的是儘可能多的隔離可能的模式改變如我所能。我只使用EF來生成實體和函數導入;整個與DB的交互都是通過函數調用來完成的。所以,無論何時用戶表更改,我想在可視化設計器中重新生成用戶實體,並根據需要更改業務邏輯代碼;我不想更改數據訪問層。目前,我沒有看到從數據訪問層到EF的那些屬性集依賴調用(就像我上面發佈的那個),這是一個恥辱,因爲這些可以很容易地與實體類一起重新生成。

有沒有其他策略可以讓我達到同樣的效果?我使用這些存儲過程的原因實際上是因爲我想完全控制SQL(也許我只是偏執狂,但它有點可怕,最終得到一堆LINQ代碼,很少或根本沒有辦法控制實際SQL)。

這樣的事情可能嗎?

謝謝

回答

0

我不認爲沒有一些額外的樣板代碼是可能的。

也許你應該重新考慮你當前的訪問策略,而不是使用存儲過程。然後你就可以像想要的那樣做。

0

這是可能的,但以不同的方式比你試圖實現它。每個實體都允許將插入,更新和刪除操作映射到存儲過程。所以在你的情況下,我假設你需要爲插入和更新操作創建映射到SaveUser存儲過程。映射完成後,每次在實體集中添加或更新實體並請求SaveChanges時,都會在內部調用存儲過程。因此,您將以與沒有存儲過程相同的方式處理實體集。請查看MSDN上的這些文章:How toWalkthrough

編輯:

嘗試使用提到的方法,並保存更改這樣:

var user = new User(); 
FillUser(user); // fill modified data to user entity 

using (var context = new MyContext()) 
{ 
    context.Users.Attach(user); 
    context.ObjectStateManager.ChangeObjectState(user, EntityState.Modified); 
    context.SaveChanges(); // This should call your Update stored procedure 
} 
+0

這就是我本來打算做的,但事情是,爲了插入,更新或刪除您需要首先從上下文中獲取它的實體。沒有選擇操作要映射到存儲過程,並且我的用戶對數據庫沒有「選擇」權限。這種想法混淆了整個想法... – tokaplan 2010-08-29 13:31:14

+0

爲什麼你認爲你首先必須從上下文中獲取實體? – 2010-08-29 13:35:51

+0

好吧,也許不是每一次,但大多數時候 - 除非我創建一個新的實體,當然。典型的場景是從數據庫獲取一個實體,用它做一些事情,也許將其保存回去。每次嘗試從數據庫獲取實體時,EF都會嘗試生成SQL查詢,而且看起來沒有辦法使其調用存儲過程。我不需要EF爲我做所有JOIN,如果必須的話,我會在SP內部完成。 – tokaplan 2010-08-29 13:52:34