entity.Database.SqlQuery() 和entity.Database.SqlCommand()

原文地址: http://msdn.microsoft.com/en-us/library/gg715124(v=vs.103)sql

使用 EF 4.1 或者更新版本, 你能夠直接執行任何數據庫命令. 在本節介紹的方法容許你對數據庫執行原生的 SQL 命令.數據庫

 

經過 SQL 查詢語句獲取實體對象集函數

DbSet 類中的 SqlQuery 方法容許你執行一個返回實體對象集的原生 SQL 查詢. 默認狀況下, 返回的對象集會被上下文跟蹤; 這能夠經過對方法返回的 DbSqlQuery 對象調用 AsNoTracking 方法取消.返回的結果集通常爲 DbSet 所對應的類型, 不然即使是其派生類也沒法返回. 若是所查詢的表包含了其餘實體類型的數據, 那麼所執行的 SQL 語句應該被正確書寫, 保證只返回指定類型實體的數據. 下面的例子使用 SqlQuery 方法執行了一個 SQL 查詢, 返回一個 Department 類型的實例集.spa

1 using (var context = new SchoolEntities()) 
2 { 
3     var departments = context.Departments.SqlQuery( 
4                     "select * from Department").ToList(); 
5 }

譯註: AsNoTracking 方法必須再查詢執行前調用, 查詢執行後調用無效.代理

經過 SQL 查詢獲取非實體對象集code

經過 Database 類中的 SqlQuery 方法來執行原生 SQL 命令, 能夠返回任何類型的實例, 包括 .Net 中的原生類型. 但獲取的數據將不會被上下文對象跟蹤, 即便咱們用這個方法來檢索實體對象. 如:orm

1 using (var context = new SchoolEntities()) 
2 { 
3     var names = context.Database.SqlQuery<string>("select Name from Department").ToList(); 
4 } 

讓數據庫執行原生的非查詢 SQL 命令對象

能夠經過 Database 類中的 ExecuteSqlCommand 方法執行非查詢命令. 例如:blog

1 using (var context = new SchoolEntities()) 
2 { 
3     context.Database.ExecuteSqlCommand("update Department set Name = 'Mathematics' where Name = 'Math'"); 
4 }

ExecuteSqlCommand 方法有時會被用在 Code First 建立的數據庫的初始化函數中, 用來對數據庫進行一些額外的配置 (例如, 設置索引). 須要注意的是, 上下文對象並不知道執行了 ExecuteSqlCommand 方法後數據庫中的數據有什麼改變, 除非你從數據庫中載入或從新載入實體集.索引

調用存儲過程

Code First 並不支持對存儲過程的映射. 可是, 你能夠經過 ExecuteSqlCommand 或 SqlQuery 方法直接調用存儲過程. 例如: context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").

譯註: 本文提到的三個方法 (DbSet.SqlQuery, Database.SqlQuery, Database.ExecuteSqlCommand) 都支持參數化查詢, 用法和 string.Format 相似, 可是在查詢執行時會對傳入的參數進行類型轉換. 如: context.Departments.SqlQuery("select * from Department where DepartmentID = {0}", "6"); 該語句執行時, 會將字符串 "6" 轉化爲整數而後再代入查詢語句中執行, 能夠有效防止 SQL 注入.

防止 SQL 注入攻擊

應用程序常常要從外部獲取輸入 (來自用戶和其餘外部代理) , 而後根據這些輸入執行相關操做. 從用戶或外部代理直接或間接獲取的任何信息均可能利用目標程序語言的語法來執行違法操做. 當目標語言是結構化查詢語言 (SQL) 時, 例如 Transact-SQL, 這個操做被稱爲 SQL 注入攻擊. 惡意的用戶能夠直接在查詢中注入命令執行操做, 刪除數據庫中的一個表, 拒絕提供服務或修改正在執行的操做的性質. 故你應該使用參數化的查詢, 而不是直接將從外部獲取的字符串插入到查詢字符串中.

相關文章
相關標籤/搜索