1. 程式人生 > >Entity Framework直接執行SQL語句

Entity Framework直接執行SQL語句

一般來說linq在EF中滿足了絕大部分的查詢需求,而插入、刪除則需要根據實體來操作,在一些情況下會造成一些麻煩。

比如現在有這樣的關係:

它在資料庫中生成的表:

那麼在實體物件上下文如果想直接操作某些Product與Category的關聯時將麻煩不少,因為不能在EF下直接操作ProductCategory中間表。那麼這時直接執行SQL語句來新增、刪除兩者之間關係會好上不少。我便是這樣寫的:

 1         /// <summary>
 2         /// 新增產品到小類
 3         /// </summary>
 4         /// <param name="proID">
產品ID</param> 5 /// <param name="catIDs">小類ID列表</param> 6 public bool AddProductToCategory(int proID, IList<int> catIDs) 7 { 8 bool result = true; 9 foreach (var catID in catIDs) 10 { 11 try 12 {
13 string sql = "Insert Into [ProductCategory] Values (@proID,@catID)"; 14 var args = new DbParameter[] { 15 new SqlParameter { ParameterName = "proID", Value = proID}, 16 new SqlParameter("
catID",catID) 17 }; 18 _DataModelEntity.ExecuteStoreCommand(sql, args); 19 } 20 catch (System.Exception ex) 21 { 22 LogHelper.WriteLog(ex); 23 result = false; 24 } 25 } 26 return result; 27 } 28 29 /// <summary> 30 /// 刪除小類產品關係 31 /// </summary> 32 /// <param name="proID">產品ID</param> 33 /// <param name="catIDs">小類ID</param> 34 public bool DeleteProductToCategory(int proID,IEnumerable<int> catIDs) 35 { 36 bool result = true; 37 foreach (var catID in catIDs) 38 { 39 try 40 { 41 string sql = "Delete From [ProductCategory] Where [Product_ID] = @proID And [Category_ID] = @catID"; 42 var args = new DbParameter[] { 43 new SqlParameter { ParameterName = "proID", Value = proID}, 44 new SqlParameter("catID",catID) 45 }; 46 _DataModelEntity.ExecuteStoreCommand(sql, args); 47 } 48 catch (System.Exception ex) 49 { 50 LogHelper.WriteLog(ex); 51 result = false; 52 } 53 } 54 return result; 55 }
執行SQL

實際上已經有不少博文中提到了這些使用方法,這裡我只是強調它的使用條件,大部分環境下,LINQ和EF的配合已經趨於完美了。